Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Verkehrssimulation: Modell aus Buch mit Simulink nachstellen

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

 

wgttzs!
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 62
Anmeldedatum: 02.12.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2022, 13:24     Titel: Kleinere Matrix zurückgeben
  Antworten mit Zitat      
Hallo,

ich habe zwei Funktionen in der ersten definiere ich die Größe der Matrix m=zeros(x*24*60*60*5, 3). Ich weiss, dass meine spätere Matrix, die ich zurückgebe maximal so groß sein wird. In meiner zweiten Funktion wird die Matrix erzeugt und noch etwas bereinigt d.h. die zurückgegebene m Martix ist etwas kürzer als meine vorher definierte Matrix und ich bekomme folgenden Fehlercode:

Code:
Unable to perform assignment because the size of the left side is 432000-by-3 and the size of the right side is
431997-by-3.


Jetzt habe ich was von rmmissing gelesen, bisher aber keinen ähnlichen Lösungsansatz im Internet gefunden
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: 01.02.2022, 15:21     Titel:
  Antworten mit Zitat      
Hallo,

welchen Code verwendest du denn?
Wie sollen aus den 431997 Zeilen auf der einen Seite die 432000 Zeilen auf der anderen werden?

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: 01.02.2022, 16:28     Titel:
  Antworten mit Zitat      
In meiner Funktion wird die Matrix m erstellt m=zeros(x*24*60*60*5, 3). Wobei x immer für die Anzahl an Datensätzen steht. In der zweiten Funktion wird der Datensatz (432000,3) eingelesen,dabei wird jenach dem der ein oder andere Wert herausgefiltert, sodass nicht immer ganz 432000 Werte zurückgegeben werden. Wie kann ich das am besten machen,dass die Matrix m=zeros(x*24*60*60*5, 3) am Ende angepasst wird, weil ich ja zu Beginn nicht weiss wie viel bei x Datensätzen wie viel Werte rausgefiltert werden. Ich weiss nur,dass meine Matrix maximal 432000,3 groß wird

1.Funktion:

m=zeros(x*24*60*60*5, 3)

for r=1:x

%Daten werden übergeben und zurückgegeben

end

%Die Daten werden in eine Tabelle übergeben

DataMat=table usw.

2. Funktion:

%Daten werden nach einen gewissen Schema gefiltert usw.

DataMat = [t,u,p];
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: 01.02.2022, 17:02     Titel:
  Antworten mit Zitat      
Hallo,

das reicht nicht so ganz, um das Problem nachzuvollziehen. Insbesondere ist mir weiterhin nicht klar, wie die 431997 Zeilen und die 432000 Zeilen zusammengefügt werden sollen.

Es könnte darauf hinauslaufen, dass du dir wie in deiner vorherigen Frage "merkst", welche Zeilen entfernt wurden, und diese Zeilen auch aus der größeren Matrix entfernst.

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: 01.02.2022, 18:11     Titel:
  Antworten mit Zitat      
ok, alles klar. Hier nochmal ein bisschen ausführlicher:

Hier nochmal die erste Funktion:

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
     
        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
   
   
DatTable = table(DatMat(:,1), DatMat(:,2),DatMat(:,3));

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


end



2. Funktion:

Code:
function [DatMat,CalcMat]  = funktion_2(....)

%Daten werden geladen

%hier wird aus den ursprünglich 432000,3 zu 4321997,3 Datensätzen...

removezero = u(:,1)==0;
p(removezero,:)=[];
t(removezero,:)=[];

%dann wird durch einen Algorithmus CalcMat erstellt

DatMat= [t,u,p];

CalcMat =[k,z];

end


Zum Beispiel tritt an der Stelle 84805,2 eine Null auf, dann nehme ich diese Zeile raus. Dann müsste ich mir die 84805 ste Zeile merken...
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: 01.02.2022, 18:27     Titel:
  Antworten mit Zitat      
Hallo,

In Funktion 2: Aus u selbst musst du die Elemente schon auch entfernen.
Code:
u(removezero,:)=[];


In Funktion 1:
ich würde das Ergebnis von Funktion 2 in eine temporäre Variable schreiben, deren Größe abfragen, und das dann entsprechend nutzen um DatIdx zu kürzen.

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: 01.02.2022, 21:34     Titel:
  Antworten mit Zitat      
Danke!

Also das mit der tempoären Variable und der Größe verstehe ich, aber wie

Code:
d=u;
s=p;
e=t;

[numRows,numCol] = size(u);


 



Soll ich dann so DatIdx=zeros(numRows,numCols); kürzen?
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: 01.02.2022, 22:30     Titel:
  Antworten mit Zitat      
Hallo,

es geht um Funktion 1 und speziell die Zeile, die vermutlich die Fehlermeldung wirft. Statt
[DatMat(DatIdx,:),CalcMat(CalcIdx,:)] = funktion_2(....)
meine ich z.B.
Code:
[d, c] = funktion_2(....);
startIdx = ((r-1)*24*60*60*5+1);
DatMat(startIdx:startIdx + size(d,1)-1,:) = d;
CalcMat(startIdx:startIdx + size(c,1)-1,:) = c;


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: 02.02.2022, 15:32     Titel:
  Antworten mit Zitat      
Vielen, vielen Dank! Ich habs geschafft alles anzuwenden!

Am Ende werden meine x Datensätze in einem Table an einander gereiht. Kann ich dann ab dem zweiten Datensatz, die Werte zum Beispiel 84803 und 142722 (stehen dann in CalcTable) mit dem jeweils neu ermittelten z.B. size(d) addieren?

Zum Beispiel wenn mein x=2 ist und die Matrix 4321997,3 groß ist. Kann ich dann 84803 und 142722 mit 4321997 addieren. Wenn mein x=3 ist und die Matrix 432000,3 groß ist kann ich dann 84803 und 142722 mit 432000 addieren?
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: 02.02.2022, 17:23     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Vielen, vielen Dank! Ich habs geschafft alles anzuwenden!

Wunderbar. Ich hoffe, es läuft nicht nur fehlerfrei, sondern fügt Dinge auch an den richtigen Stellen ein.

Was die Frage jetzt angeht: ich komme da nicht ganz mit.
size(d) ist ein ganz normaler Vektor mit (meist) 2 Elementen, aus dem man mit size(d, dim) direkt ein bestimmtes Element ziehen kann. Klar kann man dazu was addieren, das habe ich ja auch schon in meinem Vorschlag gemacht.

Zitat:
Kann ich dann 84803 und 142722 mit 4321997 addieren

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

ans =

     4406800     4464719


Welche Rolle spielt denn x bei der Sache? Geht es wenn überhaupt nicht eher um r?

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: 02.02.2022, 22:11     Titel:
  Antworten mit Zitat      
Zitat:
Also so?
Code:
size(d,1) + [84803, 142722]

ans =

4406800 4464719


Genau so.

x ist die gesamte zahl aller Datensätze und r nur ein Datensatz.

Gibt es noch ein Mittel, wenn ich am Ende meine Werte in Table ablege, dass sich der erste wert nicht auf den zweiten aufsummiert und der dritten Spalte die summe aus ersten,zweiten und dritten Wert steht?
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: 02.02.2022, 23:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Gibt es noch ein Mittel, wenn ich am Ende meine Werte in Table ablege, dass sich der erste wert nicht auf den zweiten aufsummiert und der dritten Spalte die summe aus ersten,zweiten und dritten Wert steht?

Gibt es ziemlich sicher. Ich weiß nur nicht, wer sich wo auf wen aufsummiert, ob sich das "ersten,zweiten und dritten Wert" nun auf Zeilen oder Spalten summiert oder was der andere Index sein soll, geschweige denn was an den anderen Zeilen bzw. Spalten stehen soll.

Um eine Frage gut zu formulieren, kann es hilfreich sein, sich das selbst nochmal durchzulesen und sich zu fragen: "würde ich das verstehen, wenn ich nicht schon vorher wüsste, was ich will?" Wenn nicht, bitte umschreiben.

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: 02.02.2022, 23:39     Titel:
  Antworten mit Zitat      
Stimmt da hast du recht! Hier nochmal ein Versuch:

u p

1 1
2 2
3 3
4 4
5 5

So sollten meine Spalten eigentlich aussehen:

Rauskommt aber sowas:

u p

1 1
3 3
6 6
10 10
15 15

Die erste Zeile wird noch richtig abgelegt. Die zweite Zeile enthält den Wert der ersten Zeile und den der zweiten Zeile usw.
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: 02.02.2022, 23:58     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
u p

1 1
2 2
3 3
4 4
5 5

Das ist der beispielhafte Ausgangspunkt?

Zitat:
So sollten meine Spalten eigentlich aussehen:

Ja... wie?

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: 03.02.2022, 12:20     Titel:
  Antworten mit Zitat      
Genau das ist der beispielhafte Ausgangspunkt:

u p

1 1
2 2
3 3
4 4
5 5

So sollten sie ausssehen.

In Wirklichkeit sehen sie aber so aus:

u p

1 1
3 3
6 6
10 10
15 15

Ich habe schon versucht die Matrix nach dem ersten Datensatz zu nullen, funktioniert aber nicht
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.