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

Aufsummieren von Werten der gleichen Kategorie

 

s3hannah
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2017, 18:56     Titel: Aufsummieren von Werten der gleichen Kategorie
  Antworten mit Zitat      
Hallo ihr Lieben,

um mein Problem verständlicher zu beschreiben, hab ich mal eine grobe Skizzierung meiner Matrix im Anhang beigefügt. Ich hoffe das hilft.

Ich suche also immer die Summe über eine bestimmte Kategorie innerhalb einer Region (Spalte) und bin mir unsicher wie ich dies für eine sehr große Matrix hinbekomme. Ich denke ich müsste zuerst definieren, dass es 14 Kategorien gibt? Und dann sagen, dass jeweils die erste Category innerhalb einer Spalte aufaddiert werden soll sowie die zweite etc.

Da ich mit Matlab bisher nicht so viel Erfahrung habe, wäre ich für Tipps dankbar!

Bildschirmfoto 2017-05-06 um 18.51.48.png
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2017-05-06 um 18.51.48.png
 Dateigröße:  41.59 KB
 Heruntergeladen:  257 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2017, 19:07     Titel:
  Antworten mit Zitat      
Hallo,

wenn das Muster der Kategorien einheitlich ist, kannst du für jede Spalte diese mit reshape in eine Matrix umformen, so dass die Werte einer Kategorie immer in einer Zeile oder Spalte stehen. Dann kannst du direkt sum darauf anwenden.
Falls das Muster nicht einheitlich ist, helfen findgroups und splitapply .

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
s3hannah
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2017, 19:20     Titel:
  Antworten mit Zitat      
Danke dir! Das Muster ist einheitlich. Allerdings habe ich über 3000 Spalten. Wie kann ich reshape automatisch auf alle anwenden? Oder gibt es in diesem Fall eine bessere Lösung?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2017, 19:41     Titel:
  Antworten mit Zitat      
Hallo,

indem du eine for-Schleife schreibst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
s3hannah
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2017, 20:56     Titel:
  Antworten mit Zitat      
Es tut mir wirklich leid, aber ich komme nicht drauf wie ich die loop schreiben muss und wäre für einen weiteren Hinweis sehr dankbar!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

poste bitte immer deine bisherigen Versuche und die genauen Probleme, die dabei auftreten. Dann kann man dir leichter helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
s3hannah
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2017, 18:50     Titel:
  Antworten mit Zitat      
Meine bisherigen Versuche sind leider gescheitert. Ich habe z.B. folgendes probiert:


Code:
ncol = size(A,2);    %die Anzahl der Spalten ist 3500
for k = 1:ncol;
B=reshape(k,[14,250]);
end;


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

Forum-Meister


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

erste Verbesserungsvorschläge:
Code:
ncol = size(A,2);
C = zeros(14, ncol);
for k = 1:ncol;
C(:, k)=mean(reshape(A(:,k), 14, []));
end;


... und bitte auch nicht vergessen zu schreiben, welche Probleme bei den Versuchen aufgetreten sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
s3hannah
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2017, 15:53     Titel:
  Antworten mit Zitat      
Danke! Es funktioniert noch nicht. Ich bekomme Fehlermeldungen der Art "Subscripted assignment dimension mismatch."

Um es besser zu verstehen, würde ich gerne wissen, wie der Output überhaupt aussehen würde, wenn ich jede Spalte durch den for loop reshape. Habe ich dann über 3000 neue einzelne Variablen in der Liste?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2017, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

mangels Daten konnte ich es nicht ausprobieren. Ich habe noch einen Blick drauf geworfen und vermute, dass dies das gewünschte macht:
Code:
  C(:, k)=sum(reshape(A(:,k), 14, []), 2);

Das entscheidende ist sum (aus irgendeinem Grund dachte ich an Mittelwert) und das ",2", denn der Mittelwert muss über die Zeilen genommen werden.

Zitat:
Um es besser zu verstehen, würde ich gerne wissen, wie der Output überhaupt aussehen würde, wenn ich jede Spalte durch den for loop reshape.

Das kann ich auch nicht besser erklären als es die Beispiele in der Doku von reshape illustrieren.

Zitat:
Habe ich dann über 3000 neue einzelne Variablen in der Liste?

Nein, die Umwandlung erfolgt nur temporär. Direkt danach wird die Summe berechnet und in die entsprechende Spalte der Ergebnismatrix geschrieben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
s3hannah
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2017, 16:29     Titel:
  Antworten mit Zitat      
Vielen Dank, das klappt nun wunderbar!
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: 08.05.2017, 17:17     Titel: Re: Aufsummieren von Werten der gleichen Kategorie
  Antworten mit Zitat      
Hallo s3hannah,

Bitte vermeide Cross-Posting. Wenn Du einen wirklich guten Grund hast, eine Frage in mehreren Foren zu posten, füge bitte Links zu den jeweiligen anderen Threads ein. Danke!

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.04.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2017, 19:19     Titel:
  Antworten mit Zitat      
Tut mir leid, das wird nicht wieder vorkommen!

Ich habe direkt noch eine Follow-Up Frage für mein weiteres Vorgehen. Nun möchte ich die einzelnen Werte in meiner ursprünglichen Matrix durch die passende Kategoriesumme teilen, um den Share zu erhalten. Also die erste Reihe der ursprünglichen Matrix durch die passende Summe über alle Cat1 teilen, die zweite Reihe der ursrpünglichen Matrix durch die jeweilige Summe über Cat2 etc. Die neue Matrix ist somit wieder eine 3500x3500 Matrix.

Ich habe mir als Code folgendes überlegt, bin mir aber nicht sicher, ob dies richtig ist, da mein Matlab damit seeehr lange beschäftigt ist und mir kein Ergebnis anzeigen kann. Vielleicht kann man dies beschleunigen?

Code:

Clong=repmat(C,250,1);  % ich würde also das Ergebnis von oben einfach verlängern auf 3500 Reihen

D=zeros(3500,3500);
    for k=1:3500
    D(k,:) = A(k,:)*inv(diag(Clong(k,:)));
    end;
   
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2017, 19:33     Titel:
  Antworten mit Zitat      
Hallo,

das Berechnen der Inversen wird Zeit in Anspruch nehmen.

Wenn du zwei Vektoren komponentenweise durcheinander teilen möchtest, dann ist ./ deutlich effizienter und einfacher.
Inzwischen (seit R2016b) kann MATLAB auch implicit expansion, also mit Matrix A und Vektor C
Code:
D = A ./ C;

In älteren Versionen kannst du dir mal bsxfun ansehen.

Grüße,
Harald
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.