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

Matrizen in verschachtelter Array elementweise addieren

 

Monika
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2016, 15:56     Titel: Matrizen in verschachtelter Array elementweise addieren
  Antworten mit Zitat      
Hallo zusammen!

Ich bin ganz neu hier und habe eine Frage zur Addition von Matrizen in Arrays.

Und zwar habe ich eine verschachtelte Array "Test" mit zwei Zellen {1,1} und {2,1}. Innerhalb dieser Zellen befinden sich in den Zellen {1,1} bis {4,2} insgesamt vier 767x6 Matrizen, die ich innerhalb dieser Zellen gerne elementweise aufeinander addieren möchte, sodass ich statt vier Matrizen eine Matrix der Dimension 767x6 habe. Ich brauche also einen Befehl, der mir in Test{1,1} und in Test{2,1} jeweils die vier hinterlegten 767x6 Matrizen elementweise addiert:

temp_1{1,1}{1,1}+temp_1{1,1}{2,1}+temp_1{1,1}{3,1}+temp_1{1,1}{4,1}
und
temp_1{2,1}{1,1}+temp_1{2,1}{2,1}+temp_1{2,1}{3,1}+temp_1{2,1}{4,1}

Zudem muss die Anzahl der Zeilen der Zellen und Unterzellen variabel gehalten werden (so wie in dem Code unten , der leider nicht funktioniert, mit den Laufkoordinaten i und k gezeigt ist).

Ich habe gestern ziemlich lange im Internet gesucht und viele Befehle ausprobiert, aber nichts davon hat funktioniert. Habt ihr vielleicht eine Idee?

Vielen Dank!
Gruß,
Monika


Code:

Test{1,1}{1,1}=rand(767,6);
Test{1,1}{2,1}=rand(767,6);
Test{1,1}{3,1}=rand(767,6);
Test{1,1}{4,1}=rand(767,6);

Test{2,1}{1,1}=rand(767,6);
Test{2,1}{2,1}=rand(767,6);
Test{2,1}{3,1}=rand(767,6);
Test{2,1}{4,1}=rand(767,6);

dudu=cell(e,1);
for i=1:2    
    for k=1:4
        dudu{i,1}=cell2mat(sum(Test{i,1}{k,1}));
    end
end


[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 15.01.2016, 16:15     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion sum summiert seinen Inhalt zu einer Summe. Das ist ja anscheinend nicht gewollt.

So könnte es gehen:

Code:

dudu = zeros(767,6,2); % 2 Matrizen der Größe 767x6 mit Nullen initialisieren
for i=1:2
    for k=1:4
        dudu(:,:,i) = dudu(:,:,i) + Test{i,1}{k,1}; % Aufsummieren von 4x 767x6
    end
end
 


Allerdings könnte man den 1. ersten Summendurchgang auch sparen, in dem man dudu gleich mit den jeweils 1 Matrizen Test{1,1}{1,1} und Test{2,1}{1,1} initialisiert.
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.01.2016, 19:01     Titel: Re: Matrizen in verschachtelter Array elementweise addieren
  Antworten mit Zitat      
Hallo Monika,

Es wäre viel einfacher, wenn Du hier nicht geschachtelte Cell-Arrays sondern mehrdimensionale numerische Arrays verwenden würdest. Cell-Arrays sind nur dann hilfreich, wenn die Elemente unterschiedliche Größe oder Typ haben.

Wann immer Du im Forum schreibst "funktioniert nicht", wird eine genaue Erklärung benötigt: Bekommst Du eine Fehlermeldung? Weichen die ergebnisse von Deinen Erwartungen ab?

Code:
Test = rand(767, 6, 2, 4);
dudu = sum(Test, 3);


In Deinem Code wird "dudu{i,1}" in jeder Iteration in der "for k"-Schleife überschrieben. Das cell2mat ist überflüssig, soweit ich sehe.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2016, 10:32     Titel:
  Antworten mit Zitat      
Hallo zusammen!

Vielen Dank für eure Antworten. Der von DSP vorgeschlagene Code funktioniert leider nicht.
@Jan: Ich bin mir nicht sicher, wie ich das angehen soll. In dem Code unten sieht man, in welcher Form meine Daten vorliegen. Das Ergebnis in m{1,1} ist genau das was ich möchte. Allerdings sind die Ergebnisse in m{2,1} falsch..
m{2,1} soll genauso gebildet werden wie m{1,1} gebildet wurde.

Code:
e=2;
snap=8;
stepsize=2;
a=3;
Zug_E11=rand(12,6);
EigenV=rand(4,2);
temp_1=cell(e,1);
temp_2=zeros(3,6);

for l=1:e        
    for n=1:snap/stepsize
        temp_1{l,1}{n,1}(1:a,:)=EigenV(n,l)*Zug_E11((n-1)*a+(1:a),:);
        temp_2=temp_2+temp_1{l,1}{n,1};
    end
    m{l,1}=temp_2;
end
 


Ich würde mich sehr darüber freuen, wenn mir jemand helfen könnte!

Vielen Dank,
Monika
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.01.2016, 19:52     Titel:
  Antworten mit Zitat      
Monika hat Folgendes geschrieben:
Hallo zusammen!

Vielen Dank für eure Antworten. Der von DSP vorgeschlagene Code funktioniert leider nicht.


Warum nicht? Das Ergebnis entsprach genau deinen Vorgaben, an Hand deiner Testdaten und der benötigten Summenglieder.

Damit es einfacher nachvollziehbar ist, habe ich statt Zufallszahlen jeweils nur 1 Zahl in eine 767x6 Matrix

Code:

Test{1,1}{1,1}=ones(767,6);
Test{1,1}{2,1}=ones(767,6).*2;
Test{1,1}{3,1}=ones(767,6).*3;
Test{1,1}{4,1}=ones(767,6).*4;

Test{2,1}{1,1}=ones(767,6).*5;
Test{2,1}{2,1}=ones(767,6).*6;
Test{2,1}{3,1}=ones(767,6).*7;
Test{2,1}{4,1}=ones(767,6).*8;

% temp_1{1,1}{1,1} + temp_1{1,1}{2,1} + temp_1{1,1}{3,1} + temp_1{1,1}{4,1}
% 1 + 2 + 3 + 4 = 10
% und
% temp_1{2,1}{1,1} + temp_1{2,1}{2,1} + temp_1{2,1}{3,1} + temp_1{2,1}{4,1}
% 5 + 6 + 7 + 8 = 26

dudu = zeros(767,6,2); % 2 Matrizen der Größe 767x6 mit Nullen initialisieren
for i=1:2
    for k=1:4
        dudu(:,:,i) = dudu(:,:,i) + Test{i,1}{k,1}; % Aufsummieren von 4x 767x6
    end
end
 


Das Ergebnis sind 2 Matrizen mit 767x6 Elementen wobei, Matrix 1 überall 10 und M2 überall 26 stehen hat. Was ist daran nun falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Monika
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 15.01.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2016, 12:14     Titel:
  Antworten mit Zitat      
Ich habe Fehler nun gefunden. Ich habe temp_2 nun nach jedem Durchgang der Schleife wieder auf Null gesetzt. Das war vorher verkehrt, weswegen die Matrizen alle immer und immer wieder einfach drauf addiert wurden, sodass nur die erste errechnete Matrix gestimmt hat. Nun stimmt das Ergebnis aber.

Code:

for l=1:e    
    temp_2=zeros(3,6);
    for n=1:snap/stepsize
        temp_1{l,1}{n,1}(1:a,:)=EigenV(n,l)*Zug_E11((n-1)*a+(1:a),:);
        temp_2=temp_2+temp_1{l,1}{n,1};
    end
    m{l,1}=temp_2;
end
 


Trotz allem herzlichen Dank für eure Hilfe!

Gruß,
Monika
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.