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

Matrix-Spalten aufsummieren und am Ende speichern

 

MRBBB
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2015, 17:25     Titel: Matrix-Spalten aufsummieren und am Ende speichern
  Antworten mit Zitat      
Hallo zusammen,

Ich bin grad ein bisschen verloren in Matlab. Das Problem ist folgendes:
Ich habe eine 152x3 Matrix. In der ersten Zeile befinden sich bestimmte Werte. In der jeweiligen Spalte folgen die zugehörigen Häufigkeitsverteilungen. Ich möchte nun, bis auf die erste Zeile, die gesamte Spalte aufsummieren und am Ende der Spalte, also in Zeile 153 "speichern".
Da ich aber manchmal mehr Spalten habe außer 3, wollte ich das ganze mit einer For-Schleife realisieren, damit diese mir das ganze automatisiert.
Folgendermaßen sieht gerade mein Code aus:

.......

Code:
for o = 1 : 1: length(a(:,1));      
   B(153,:)= sum(a(1,:));
   o = length(a(:,+1));
end


.......

Habe wirklich schon einiges probiert, aber als Laie nicht das gewünschte Ergebnis erzielt. Wäre über jede Hilfe sehr dankbar.


LG MRBBB
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.01.2015, 18:55     Titel:
  Antworten mit Zitat      
hallo mrbbb bei deinem code sind einige sachen schief gelaufen Smile ich würde dir raten das getting startet von matlab einmal durchzuarbeiten die documentation von matlab ist wirklich sehr gut und das hilft doch sehr Smile

Code:
for o = 1 : 1: length(a(:,1));

die standart schrittweite ist immer 1 also kann man sich die angabe dieser schrittweite spaaren.
der befehl length giebt immer die größte diemension wieder. das kann zu unbeabsichtigten ergebnissen führen. ich würde daher zur verwendeung des befehls
Code:
mit entsprechender diemensions angabe raten.
Code:
B(153,:)= sum(a(1,:));
du versuchst hir eine zeile eine einzige zahl zuzuweisen. das geht zwar ist aber nicht das was du willst. guck dir mal den befehl sum in der dokumentation an. es ist möglich die dimension über die summiert werden soll mit angzugeben. das macht die schleife unnötig.
Code:
o = length(a(:,+1));

es ist zwar möglich die laufwariable temporär zu überschrieben aber nicht langfristig. die laufvariable wird immer wieder auf ihren richtigen wert zurück gesetzt werden beim schleifen anfang. außerdem glabe ich das das ganze überhaubt nix mit deinem problem zu tun hat. der sinn dieser zeile erschließt sich mir jedenfalls nicht.
des weiteren ist es immer wichtig fehlermeldungen zu posten wenn etwas nicht geht und zu sagen was nicht geht Smile
neuligen kann ich dazu den thread aus meiner signatur empfehlen. das erspaart allen viel arbeit und ermöglicht es uns dir schnell und efizient zu helfen.
grüße winkow
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
MRBBB
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 08:35     Titel:
  Antworten mit Zitat      
Hallo Winkow,

erstmal vielen herzlichen Dank für deine Ratschläge und Hilfe!
Deinen Rat werde ich folgen Very Happy .
Eine Fehlermeldung gibt es nicht. Mein Code funktioniert somit richtig, nur macht es halt nicht das was ich möchte Crying or Very sad
Hier wird lediglich die erste Spalte korrekt aufsummiert.

Die For-Schleife habe ich nur geschrieben, damit mir aufsteigend, also Spalte 1 aufsummiert wird, dann Spalte 2, Spalte 3....
Das hier ist quasi mein Start.

Code:
B(153,:)= sum(a(1,:));


Also das Ergebnis der ersten aufsummierten Spalte soll in Zeile (153,1) gespeichert werden.

Dann soll Spalte 2 drankommen, aufsummiert und in (153,2) gespeichert werden und das für alle vorhandenen Spalten...

Mit
Code:
o = length(a(:,+1));

soll inkrementiert werden, also von Spalte 1 aus hochzählen und alle Spalten nacheinander aufsummieren.

Danke nochmals sehr für deine Bemühungen!

LG MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2015, 08:57     Titel:
  Antworten mit Zitat      
Hallo,

hast du denn nun mal die Doku zu sum gelesen? Dort steht nämlich, dass sum auf Matrizen standardmäßig spaltenweise operiert (wie übrigens viele andere statistische Funktionen auch).

Code:
liefert also die gewünschten Informationen, und mit
Code:
a(end+1,:) = sum(a);

werden sie ans Ende der Matrix angefügt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 10:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

auch ein Dankeschön an dich!
Ja die Doku zu sum habe ich erneut mehrmals gelesen, habe sie aber auch schon mehrmals korrekt in anderen Codes richtig umgesetzt.
Vielleicht habe ich mich zu meiner Problematik nicht richtig ausdrücken können. Ich gehe es mal Schritt für Schritt durch:

Code:
for o = 1 : 1: size(a(:,1));

Soll meine For-Schleife definieren, um die Spalten (je nach Größe der Matrix automatisch durchzugehen und aufsummieren soll, da die Größe variiert.

Bsp:
    0 1 2

    1 2 3

    2 3 4

    ------

    3 6 9


Code:
B(153,:)= sum(a(1,:));

Hiermit sollen die aufsummierten Spalten am Ende der Matrix, hier Zeile 153, abgelegt werden.

Code:
o = length(a(:,+1));

Das soll mein Inkrement sein, dass wenn die erste Spalte aufsummiert und abgelegt ist, in die nächste Spalte gesprungen wird und diese dann aufsummiert ablegt und für die ganzen weiteren Spalten dies wiederholt..

Gerade wird in meiner Matrix in die gewünschte Zeile (153) zwar ein Wert abgelegt, was aber weder der korrekte Wert ist, noch ich weiß woher dieser Wert eigentlich stammt bzw. errechnet wird..

Grüßee MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2015, 10:27     Titel:
  Antworten mit Zitat      
Hallo,

ich meine, durchaus verstanden zu haben, was du erreichen möchtest.

Warum bestehst du aber darauf, eine for-Schleife zu verwenden, obwohl ich dir einen m.E. sehr einfachen Weg gezeigt habe, wie das ohne for-Schleife erledigt werden kann?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 10:46     Titel:
  Antworten mit Zitat      
Hallo,

jetzt bin ich total verwirrt... Question

Die For-Schleife benutze ich nur, damit alle Spalten automatisch nacheinander aufsummiert werden und nicht nur immer dieselbe Spalte für alle dasselbe Ergebnis liefert.

Daher dachte ich, dass die For-Schleife dafür bestens geeignet ist.


Grüße MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2015, 10:55     Titel:
  Antworten mit Zitat      
Hallo,

man kann dafür eine for-Schleife verwenden, aber ohne geht es eben viel einfacher. MATLAB ist sehr vektor- und matrizenorientiert, so dass for-Schleifen häufig einfach unnötig sind.

Nochmal speziell für dein Beispiel:
Code:
a = [0 1 2; 1 2 3; 2 3 4];
a(end+1,:) = sum(a)


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 11:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

auch dir ein dickes Dankeschön für deine Hilfe!
Allerdings scheint igwas nicht zu stimmen..

Das hier funktioniert tadellos:

Code:
a = [0 1 2; 1 2 3; 2 3 4];
a(end+1,:) = sum(a)


warum aber nicht, wenn ich das für mein Code anwende...?
Habe die Ausgangsmatrix transponiert, kann es vielleicht daran legen?

So siehts gerade aus:
Code:
AA   = [unique(B2(:, :)), histc(B2(:, :), unique(B2(:, :)))];
III = AA';
III(end+1,:)= sum(III);



Grüße MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2015, 12:36     Titel:
  Antworten mit Zitat      
Hallo,

die letzte Zeile summiert jede Spalte von III und schreibt das Ergebnis darunter. Das Problem liegt wenn in den beiden Zeilen darüber. Ob du da nun das machst was du möchtest und falls nicht inwiefern nicht, wirst nur du beantworten können.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 13:26     Titel:
  Antworten mit Zitat      
Hallo,

also die erste Zeile tut mir nur, wie bereits erwähnt, die Häufigkeitsverteilung der Matrix B2 ausgeben. B2 ist eine Matrix mit diversen Werten. Zu jedem vorkommenden Wert, wird hier dessen Häufigkeit ermittelt. Da ich aber die AA Matrix in transponierter Form brauche, tu ich dies in Zeile zwei einfach transponieren und neu unter der III Variable speichern. Und der Rest ist ja genau die Problematik, die ich habe....


Grüße MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.01.2015, 13:34     Titel:
  Antworten mit Zitat      
Hallo,

willst du denn in der transponierten Form nun über die Spalten oder die Zeilen summieren?

Code:

summiert über die Spalten, egal was du davor oder danach anstellst.

Code:

summiert über die Zeilen (siehe auch Dokumenation)

Falls du letzteres willst, wäre es allerdings geschickter, erst zu spaltenweise zu summieren und dann zu transponieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 13:41     Titel:
  Antworten mit Zitat      
Hallo Harald,

in der transponierten Form möchte ich die Spalten summieren.
Habe nun folgendes gemacht; die Summen nicht in die vorhandene Matrix abgelegt:

Code:
III(end+1,:)= sum(III);


sondern als eine Variable deklariert und abgespeichert:

Code:


So funktioniert wie es sein soll, allerdings möchte ich die Summanden eben in der Matrix III, wo die jeweiligen Werte stehen und nicht separat eine Matrix mit den Summanden..

Bzw wie wäre es umzusetzen, wenn ich in eine neue Matrix, die vorher nicht bekannte erste Zeile der Matrix III und drunter die jeweiligen Summanden ablegen möchte?

Grüße MRBBB
Private Nachricht senden Benutzer-Profile anzeigen
 
MRBBB
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 15.01.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2015, 14:07     Titel:
  Antworten mit Zitat      
Hallo zusammen,

vielen Dank für die tolle Unterstützung!
Mein besonderer Dank geht an Harald!
Diese Hürde ist dann mal gemeistert..
Habe meine letzte Frage selbest beantwortet.


Grüße MRBBB
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 - 2024 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.