ich habe eine Aufgabe, die ich nicht so recht gelöst bekomme. Und zwar habe ich eine große Matrix mit 2 Spalten und einigen 100.000 Zeilen. Die Werte in der 1. Spalte liegen zwischen 1000 und 2000. Sie steigen mit der Schrittweite 1 auf, die Anzahl ist jedoch unregelmäßig. Es gibt also z.B. 245 mal die 1000 in der ersten Spalte, zu denen in der zweiten Spalte je ein Wert zugeordnet ist. Dann schließen sich z.B. 400 mal 1001 an usw. (alles in einer großen Matrix, die ich S1 genannt habe).
Ich würde die Matrix gerne separieren, d.h. für alle Zeilen, die mit 1000 beginnen, eine einzelne Matrix. Dann die, die mit 1001 beginnen usw. Also insgesamt 1001 einzelne Matrizen erzeugen.
Mein Ansatz ist, aber ich glaube der ist uneffizient, und ich weiß, dass er nicht korrekt ist von der Syntax, der folgende:
Code:
for i=1000:2000
S1ersatz=S1;
for j=1:length(S1) if S1ersatz(j,1)==i
else S1ersatz(j,2)=99;
end end
S1ersatz(S1ersatz(1,:)==99,:)=[];
(['Regenmenge_' num2str(i) '=S1ersatz']);
end
D.h. für den Fall i=1000: wenn der erste Wert in jeder Zeile nicht i entspricht, soll er eine 99 notieren und am Ende alle Zeilen mit 99 drin eliminieren. Das funktioniert aber nicht. Was ist falsch?
Danke für eine Antwort!
Gast1
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.08.2011, 16:04
Titel:
Du willst ernsthaft 1001 Vektoren mit eigenem Namen erzeugen?
Das ist sehr umständlich, fehleranfällig und ein sehr schlechter Stil.
(das deine Syntax falsch ist, hast du ja schon selbst erkannt, falls du immernoch den Weg gehen willst, solltest du dir "eval" in der Dokumentation anschauen)
Eine bessere Lösung wären Cell Arrays (auch hier ist die Doku sehr hilfreich)
Wenn ich es richtig verstanden habe, kommt folgendes deiner gesuchten Lösung nahe:
Das hier sollte wohl etwas übersichtlicher sein...
Code:
s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
m = 1;
for i=1000:2000 % finde alle Werte in der erste Spalte von s1 == i
index = find(s1(:,1) == i);
% Werte == i gefunden? if ~isempty(index) % Datenstruktur mit Name und Werten
Data(m).name = ['Regenmenge_',num2str(i)];
Data(m).values = [s1(index,1),s1(index,2)];
m = m + 1;
end end
Super, schon mal vielen Dank. Diese neue Struktur mit dem Data.name und Date.values war mir unbekannt. Das sieht jetzt zwar schön ordentlich aus, aber ich kann damit irgendwie nicht weiterrechnen! Am liebsten würde ich nämlich die nun separierten Blöcke derart zusammenfassen, dass die data.values pro data.name als Summe angegeben werden. Und dann am Ende für alle 1001 Summen diese wieder in eine Matrix geschrieben werden.
Daher war meine ursprgl. Idee mit den Vektoren, dann hätte ich über den Befehl sum was versucht. Wie komme ich aus dieser Struktur wieder zu einer Matrix mit der gewünschten Summenbildung?
Das du die Struktur am Ende nicht benötigst, war mir nicht bewusst.
Soll die Summe jeder Spalte dann in der Matrix stehen...oder die Summe aller Elemente mit gleichem Wert aus der 1. Spalte in s1? Beim 2. hast du dann nur noch einen Vektor...
Code:
s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
m = 1;
for i=1000:2000 % finde alle Werte in der erste Spalte von s1 == i
index = find(s1(:,1) == i);
% Werte == i gefunden? if ~isempty(index) % jeweils die Summe der Spalten mit i.tem Wert
Data_sum(:,m) = sum([s1(index,1),s1(index,2)]);
% oder Summe aller Werte der Matrix mit i.tem Wert % nicht erwünschte Variante löschen !!
Data_sum(m) = sum([s1(index,1)+s1(index,2)]);
m = m + 1;
end end
Vielen Dank, das ist echt spitze! Ich kann das ~isempty nicht ganz nachvollziehen,daher bin ich insgesamt noch nicht am Ziel. Wenn ich Deine Lösungen probiere, komme ich nicht auf das gewünschte Ergebnis. Es tut mir leid, wenn ich mich so doof anstelle!
Am Ende soll folgendes Ergebnis da stehen;
1000 6
1001...
2000 3
Die 6 ist die Summe aus 1, 2 und 3; die 3 ist die Summe aus 1 und 2 aus Deinem Beispiel.
Danke!
s1 = [1000,1;1000,2;1000,3;2000,1;2000,2]
m = 1;
for i=1000:2000 % finde alle Werte in der erste Spalte von s1 == i
index = find(s1(:,1) == i);
% Werte == i gefunden? if ~isempty(index) % jeweils die Summe der Spalten mit i.tem Wert
Data_sum(m,1:2) = [s1(index(1),1),sum(s1(index,2))]);
m = m + 1;
end end
Das ~isempty prüft, ob Werte in index sind. In diesem Bsp für s1 sind ja nur bei i = 1000 und 2000 Werte in index. Ansonsten liefert die Funktion find: index = []
Super, super, super! Ganz, ganz herzlichen Dank. Jetzt funktioniert es so, wie ich es mir erträumt habe. Vielen Dank für die Geduld!!!
Einstellungen und Berechtigungen
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
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.