Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Modellbildung und Simulation hochdynamischer Fertigungssyste

Studierende:
weitere Angebote

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Kleinere Matrix zurückgeben

 

Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2022, 13:00     Titel:
  Antworten mit Zitat      
Hallo,

nach meinem Verständnis ist dann dies der Ausgangspunkt, weil es ja so aussieht:

u p

1 1
3 3
6 6
10 10
15 15

... und das ist das gewünschte Ergebnis:

u p

1 1
2 2
3 3
4 4
5 5

Dann:
Code:
M = [u, p];
M2 = [M(1,:); diff(M)];


Da wird allerdings nichts addiert, sondern differenziert.

Sollten u und p in einem Table vorliegen, würde ich mit table2array / array2table hin- und zurückwandeln.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen


wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2022, 15:43     Titel:
  Antworten mit Zitat      
Ich habe noch eine Frage zu diesem Vorschlag:

Code:
size(d,1) + [84803, 142722]

ans =

     4406800     4464719


Wenn meine Matrix ab dem zweiten Datensatz mit der Größe der Matrix verrechnen möchte, kann ich die vorherigen Größen der Matrizen speichern, um sie mit zu addieren?

Ich versuche es mal in einem Beispiel zu verdeutlichen:

u p Größe Matrix zu addierener Wert

1 1 -
2 2 430 430
3 3 421 430+421= 851
4 4 399 430+421+399= 1250
5 5 430 430+421+399+430= 1680
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.02.2022, 22:18     Titel:
  Antworten mit Zitat      
Hallo,

cumsum

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2022, 16:00     Titel:
  Antworten mit Zitat      
Hallo Harald,

wie setze ich das am besten um?

Code:
if r>1
w=size(DatMat_transition,1);
w=w+size(DatMat_transition,1);
CalcMat(:,2)=CalcMat(:,2)+w;
end


Dann passen aber immer nur die ersten und zweiten Datensätze und der Rest ist falsch
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2022, 18:57     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Dann passen aber immer nur die ersten und zweiten Datensätze und der Rest ist falsch

Das lässt mich vermuten, dass der Codeausschnitt in einer for-Schleife steht? Es wäre gut, zumindest das auch mit einzufügen. Ebenso die Entstehung von size(DatMat_transition)

Generell wäre meine erste Empfehlung den Debugger einzusetzen um genau zu verstehen, was an welcher Stelle schief geht.

Wenn ich raten müsste, würde ich sagen, dass das Problem darin liegt, dass du w von Iteration zu Iteration behalten willst. Du überschreibst es aber mit dieser Zeile, ohne die Historie zu berücksichtigen:
Code:
w=size(DatMat_transition,1);


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2022, 13:26     Titel:
  Antworten mit Zitat      
Ich habe es jetzt hier mal eingefügt, weil ich weiss, dass dort die einzelnen Datensätze zurückgegeben werden und ich die for Schleife mit nutzen kann

Code:
function [DatTable,CalcTable] = funktion_1(....)%hier werden die Daten übergeben

DatMat = zeros(x*24*60*60*5, 3);
CalcMat = [];

for r = 1:x
   

    DatIdx = ((r-1)*24*60*60*5+1):r*24*60*60*5;
    CalcIdx = [];

    [DatMat(DatIdx,:),CalcMat(CalcIdx,:)] = funktion_2(....)

    if r==1
       CalcMat(1,2)=CalcMat(1,2);
    elseif r==2
       CalcMat(2,2)=CalcMat(2,2)+size(DatMat_transition,1);
    elseif r>2
        ?

    end
   
    if r > 1
     
        DatMat(DatIdx,[2 3]) = DatMat(DatIdx,[2 3]) + DatMat(DatIdx(1)-1, [2 3]);
        CalcMat(CalcIdx,[2 3]) = CalcMat(CalcIdx,[2 3])+ CalcMat(CalcIdx(1)-1, [2 3])
    end


end  
   
DatTable = table(DatMat(:,1), DatMat(:,2),DatMat(:,3));

CalcTable = table(CalcMat(:,1), CalcMat(:,2));


end



Ich habe aber keine Ahnung wie ich den "historischen Bezug" herstelle unter
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.02.2022, 14:39     Titel:
  Antworten mit Zitat      
Hallo,

der Ansatz mit dem w war doch vernünftig. Ich würde nur eher sagen:
Code:
if r == 1
w=size(DatMat_transition,1);
else
w=w+size(DatMat_transition,1);
end
CalcMat(:,2)=CalcMat(:,2)+w;


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
wgttzs!
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2022, 19:20     Titel:
  Antworten mit Zitat      
Ich habe jetzt nochmal das ausprobiert.Ab Datensatz 3 wird es dann falsch...

Code:
% if r==1
     w=0;
 elseif r==2
     w=size(DatMat_transition,1);
 elseif r>2
     w=size(SecondMat_transition,1);
     w=w+size(SecondMat_transition,1);
 end


Wie würde denn die Lösung mit Cumsum aussehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.044
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.02.2022, 22:06     Titel:
  Antworten mit Zitat      
Hallo,

warum ist das "if r == 1" auskommentiert? Wenn es nicht dort steht, was leitet dann stattdessen das if-Konstrukt ein?

Zitat:
Ab Datensatz 3 wird es dann falsch...

1. Welche Ergebnisse erwartest du, welche bekommst du?
2. Du hast jetzt wieder Code, der in jeder Iteration w vollkommen überschreibt. Wenn du das nicht möchtest, brauchst du in diesem Fall im else-Teil etwas, das mit dem vorherigen w weiterarbeitet. Beispiel:
Code:
if r==1
     w=0;
 elseif r==2
     w=size(DatMat_transition,1);
 elseif r>2
     % w=size(SecondMat_transition,1); % überschreibt Historie
     w=w+size(SecondMat_transition,1);
 end

Das ist nun so sinnvoll. Ob es das ist, was du willst, ist schwer zu sagen.

Die beiden Zeilen
Code:
    w=size(SecondMat_transition,1);
     w=w+size(SecondMat_transition,1);

würden übrigens zusammengefasst das bedeuten:
Code:
w = 2*size(SecondMat_transition,1);

Es ist schwer zu sagen, was du genau willst, aber das sehr wahrscheinlich nicht - hoffe ich.

Zitat:
Wie würde denn die Lösung mit Cumsum aussehen?

Das war ein sinnvoller Vorschlag zu 04.02.2022, 14:43. Dort hattest du das Problem aber soweit vereinfacht, dass es mit dem eigentlichen nicht mehr viel zu tun hatte.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2022 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.