WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

unregelmäßige for schleife (aus vektor)

 

Olsen
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2010, 18:38     Titel: unregelmäßige for schleife (aus vektor)
  Antworten mit Zitat      
Hallo Leute,
das mit gomatlab ist ein Tip von einer Kollegin und vielleicht könnt ihr ja helfen. Um mein Problem darzustellen, kopiere ich hier gleich mal ein hoffentlich anschauliches und einfaches Beispiel rein.

Code:

% abstraktes Beispiel

clear all

MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];

Y1=MAT1(:,1:3);
Y2=MAT1(:,4:7);
Y3=MAT1(:,8:9);
Y4=MAT1(:,10:14);

Yr1=[Y1 Y2 Y3 Y4];
 

% so wie die Matrix aussieht sollte auch das Ergebnis der folgenden Schleife aussehen. Tut es so aber leider nicht

% die Frage ist, wie definiere ich die Laufvariable(n) um auf ein Ergebnis wie in Yr1 zu kommen? Folgender Ansatz funktioniert nicht

Code:

M=[];

start_stops=[1 3 7 9 14];


for i = start_stops(1:end-1);
     j = start_stops(i+1:end);
   
    Y=MAT1(:,i:j);
   
    Matrix=Y';            % Matrix definieren
    M=[M;Matrix];       % M sukzessive mit Matrix auffüllen

    Yr2=M';                %liefert nicht das gewünschte Ergebnis, siehe Yr1
   
end
 

% Hoffe, das ist verständlich. Ich möchte also in Matritzen, auf unregelmäßigen Abschnitten Berechnungen durchführen. Die Matritzen sind recht groß, die Bereichgrenzen jedoch bekannt. Daher möchte ich das mit einer Schleife lösen, anstatt die Bereiche manuell zuzuweisen. Kann jmd. helfen? Danke, Olsen

edit by denny: Bitte für Code Codeumgebung verwenden. Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 15.09.2010, 19:54     Titel:
  Antworten mit Zitat      
Hallo,

1. Bitte darauf achten deinen Beispielcode in der Codeumgebung zu posten. Dies funktioniert mit dem Code Button bei der Posterstellung.

Nun zu deinem Problem. Ich haette 2 Loesungsvorschlaege:

1. der sehr simple:

Code:

MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];
start = [1 4 8 10];
stop = [3 7 9 14];
M = zeros(size(MAT1));% pre allocating

for k = 1:size(stop,2)
    M(:,start(k):stop(k)) = MAT1(:,start(k):stop(k));
end
 


2. den ich bevorzuge, da du nicht noch extra den Vektor mit den Startwerten erzeugen musst:

Code:

MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];
stop = [3 7 9 14];
M = zeros(size(MAT1)); % pre allocating

M(:,1:3) = MAT1(:,1:3);

for k = 1:size(stop,2)-1
    M(:,(stop(k)+1):(stop(k+1))) = MAT1(:,(stop(k)+1):(stop(k+1)));
end
 


Sicher gibt es auch noch einen eleganteren Weg, der mir gerade aber leider auch nicht einfaellt Smile.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2010, 22:34     Titel:
  Antworten mit Zitat      
Danke,
funktioniert auf jeden Fall beides.
werde mal gucken ob ich das auf meinen "echten" Fall angewendet bekomme.
Das mit dem code-button hatte ich nicht gesehen. Beim nächsten Mal weiß ich Bescheid.
Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2010, 09:26     Titel:
  Antworten mit Zitat      
Ok, leider habe ich ein Brett vor dem Kopf.
Bleiben wir mal beim Beispiel.

Code:
MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];
start = [1 4 8 10];
stop = [3 7 9 14];
 


Wenn ich nun Berechnungen jeweils von start1 bis stop1, start2 bis stop2 usw. durchführen möchte, also beispielsweise summieren. Wie passe ich das an? Sorry, aber ich bin wohl sowas wie ein unkreativer Anfänger.

gewünscht wäre also ein Ergebnis wie:

Code:
Y1 = sum(sum(MAT1(:,1:3)))    %=33
Y2 = sum(sum(MAT1(:,4:7)))    %=44
Y3 = sum(sum(MAT1(:,8:9)))    %=22
Y4 = sum(sum(MAT1(:,10:14)))  %=55

Yall=[Y1 Y2 Y3 Y4]             %=[33 44 22 55]
 


aber eben nicht manuell sondern mit der Schleife basierend auf den Start-Stop Werten. Nochmals Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 16.09.2010, 13:10     Titel:
  Antworten mit Zitat      
Hallo.

na das ist doch kein Problem Smile.

Code:

MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];
start = [1 4 8 10];
stop = [3 7 9 14];
M = zeros(size(stop));% pre allocating

for k = 1:size(stop,2)
    M(k) = sum(sum(MAT1(:,start(k):stop(k))));
end
 


MFG
Private Nachricht senden Benutzer-Profile anzeigen
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2010, 13:47     Titel:
  Antworten mit Zitat      
Genial. Zugegebenermaßen, für mich auch etwas unangenehm.
Ich meine ich hätte das letzte Nacht noch so probiert. Na wahrscheinlich hatte ich die Zeile in der for Schleife mit:

Code:
M(:,start(k):stop(k)) =...


begonnen. Aber das ist ja wohl was völlig anderes als M(k)=...
Danke sehr.
Mit besten Grüßen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 16.09.2010, 21:19     Titel:
  Antworten mit Zitat      
Hallo Olsen, hallo Sco,

Da sowieso über alle Spalten addiert wird, kann man das schbeller ausserhalb der Schleife machen:
Code:

MAT1 = [1 2 3 4 5 6 7 8 9 10 11 12 13 14; 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3];
start = [1 4 8 10];
stop = [3 7 9 14];
M = zeros(size(stop));% pre allocating
VEC1 = sum(MAT1, 1);
for k = 1:size(stop,2)
    M(k) = sum(sum(VEC1(start(k):stop(k))));
end


Wenn man aber nur noch einen Vektor summiert, kann man das auch ohne Schleife mit ACCUMARRAY erreichen:
Code:

index = zeros(1, stop(end));
index(start) = 1;
index = cumsum(index);
M = accumarray(index, VEC1);
 


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Olsen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 15.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2010, 08:53     Titel:
  Antworten mit Zitat      
Hi Jan,

ist wahrscheinlich eine coole Idee. Kann aber nicht testen. Sitze gerade an Matlab v6.5 und das scheint accumarray nicht zu kennen
Dank dir.

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.09.2010, 12:51     Titel:
  Antworten mit Zitat      
Hallo Olsen,

Ja, mit Matlab 6.5 geht das nicht.

Mein Code hat noch einen Tippfehler: Ein SUM ist überflüssig:
Code:
M(k) = sum(sum(VEC1(start(k):stop(k))));
==>
M(k) = sum(VEC1(start(k):stop(k)));
 


Eine andere schnelle Methode wäre CUMSUM direkt auf VEC1 anzuwenden:
Code:

MAT1 = [1 2  3 4 5  6 7 8  9 10 11  12 13 14; 10 9 8  7 6 5  4 3 2  1 0 -1  -2 -3];
start = [1 4 8 10];
stop = [3 7 9 14];
V = cumsum(sum(MAT1, 1));
M = V(stop);  % Jetzt ist M(i) um M(i-1) zu groß!
M(2:end) = diff(M);  % M(2:end) - M(1:end-1);
 

Hier ist aber eine gewisse Vorsicht notwendig: CUMSUM kann einen Überlauf produzieren und Rundungsfehler bewirken. Wenn alles Integer-Zahlen sind, ist das harmloser. Leider läuft CUMSUM und DIFF nicht mit INTs.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.