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

Teilsummen, Durchschnitte und Renditen in einer Matrix

 

Maxius

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2009, 17:26     Titel: Teilsummen, Durchschnitte und Renditen in einer Matrix
  Antworten mit Zitat      
Hallo zusammen!

Ich bin kürzlich auf das Forum aufmerksam geworden und habe tolle Tipps gefunden! Jetzt hätte ich selber eine Frage hinsichtlich der Teilsummenbildung innerhalb einer Matrix. Die Matrix hat die Dimension 2000x50.

Ich möchte für eine exakt definierte Anzahl von Intervallen (=40 Reihen pro Intervall) die jeweiligen Teilsummen bilden. D.h. in allen Spalten von Reihe 1-40, 41-80, 81-120, ... , 1961-2000 die jeweilige Teilsumme. Meiner Rechnung nach müsste dann eine 50x50 Matrix entstehen.

Welche Befehlsfolge (nur für die Teilsummenbildung, alles andere müsste passen) könnte ich hierfür verwenden?
Wie kann ich ferner die arithmetischen/geometrischen Durchschnittswerte in den Intervallen der Matrix berechnen?
Ist es auch möglich, eine Division des letzen durch den ersten Wert von Teilintervallen durchzuführen?

Ich danke Euch vielmals für den Support!

Viele Grüße

Max


Harald
Forum-Meister

Forum-Meister


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

probier mal das... wenn N die Matrix ist

Code:
sums = reshape(sum(reshape(N, 40, 2500)), 50, 50);


Idee: Matrix so umwandeln, dass die zu summierenden Werte in separaten Spalten stehen... summieren... zurückwandeln.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2009, 20:04     Titel:
  Antworten mit Zitat      
Hallo Harald,

das werde ich sofort mal ausprobieren, danke!
 
Maxius

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2009, 20:36     Titel:
  Antworten mit Zitat      
Hallo nochmal!

Hat super geklappt, nochmals vielen Dank, Harald!
Zitat:
Wie kann ich ferner die arithmetischen/geometrischen Durchschnittswerte in den Intervallen der Matrix berechnen?
Ist es auch möglich, eine Division des letzen durch den ersten Wert von Teilintervallen durchzuführen?



Könntest Du mir bei diesen Fragen auch weiterhelfen?

Gruß!
 
Sani
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.09.09
Wohnort: Neu-Ulm
Version: R2007b
     Beitrag Verfasst am: 21.09.2009, 07:56     Titel:
  Antworten mit Zitat      
Im Prinzip kannst du einen ganz ähnlichen Code verwenden.

Du hast in diesen Intervallen ja 40x50=2000 Werte.

Also:

Code:

arr_mittel = reshape((sum(reshape(N, 40, 2500))/2000), 50, 50);
 


Dann bekommste eine 50x50 Matrix anstatt mit den Teilsummen mit den arr. Mitteln.

Hoffe ich hab mich so früh noch nicht vertan Very Happy

@Harry: Übrigens ne tolle Idee muss man erstmal draufkommen Very Happy

Greez!
_________________

Wer Rechtschreibfehler findet darf sie behalten.
Codefehler bitte melden Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Maxius

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2009, 10:26     Titel:
  Antworten mit Zitat      
Guten morgen, Sani!
Auch Dir vielen Dank. Hat ebenfalls bestens geklappt! >So früh und schon so fit ;D!
Der Denkanstoß von Harald war klasse; ich hoffe demnächst auch mal solche Anstöße geben zu können >blutiger matlab-beginner!
Zitat:
Ist es auch möglich, eine Division des letzen durch den ersten Wert von Teilintervallen durchzuführen?

Diese Frage brennt mir noch auf den Nägeln.

Wie kann ich zudem zwei Matrizen mit der gleichen Form, sagen wir 32x42, durcheinander teilen; eine Division durchführen, damit wieder eine 32x42 Matrix als Ergebis herauskommt? Also quasi den i-j-Wert der ersten Matrix durch den i-j-Wert der zweiten Matrix and so on...

Dickes DANKE

Max
 
Maxius

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2009, 10:44     Titel:
  Antworten mit Zitat      
Mir ist aufgefallen, dass ich diese letzte Frage vielleicht in einem neuen Thema verpacken sollte. Gehört ja inhaltlich nicht mehr zur Fragestellung...
 
Sani
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.09.09
Wohnort: Neu-Ulm
Version: R2007b
     Beitrag Verfasst am: 21.09.2009, 10:52     Titel:
  Antworten mit Zitat      
Also das dividieren geht meiner Meinung nach mit

Code:


wobei A die erste und B die zweite Matrix ist. Der Punkt sorg dafür dass "schrittweise", wert für wert dividiert / multiplizier / addiert / subtrahiert / potenziert / .... wird


Die Division die du angesprochen hast (erster und letzer Wert von TI) ist prinzipiell möglich, da musst du aber mit Indizis arbeiten.

Bsp:

Matrix 3x2 gefüllt mit irgendwas

Code:

TI=[24,15,54;33,7,94];
erg=TI(1,1)/TI(2,3); % (Reihe1, Spalte1) / (Reihe2, Spalte3)
 


Wenn du das für alle TI machen willst brauchst du halt noch eine Schleife die dementsprechend dann hochzählt...

Kennst du Schleifen? Wenn nein schreib dann helf ich dir hab grad nur den Chef im Nacken Wink

Greez

P.S. wenn du soooooo viel wissen willst meld dich gefälligst an Wink
_________________

Wer Rechtschreibfehler findet darf sie behalten.
Codefehler bitte melden Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Maxius
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2009, 12:29     Titel:
  Antworten mit Zitat      
Hi Sani, angemeldet läuft's auch einfacher Smile !

Bei der Ausgabe von
Code:
A = B. - 1;
meldet matlab den fehler: invalid matlab syntax Sad . Ich möchte ja von jedem einzelnen Wert der Matrix den Wert "1" subtrahieren.

Aber genau, ich muss für alle Teilintervalle die Berechnung anstellen. Schleifen habe ich schon getestet. Jedoch bin ich mir nicht sicher, ob ich das hier hinbekommen.

Gruß! Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Maxius
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2009, 13:30     Titel:
  Antworten mit Zitat      
Hallo!
Super, das mit den einzelnen Teilindizes klappt. Aber bei dem Datenumfang muss ja wohl doch eine Schleife her Smile !

Wenn ich das auf meine repräsentative 32x43 Matrix beziehe, möchte ich ja für jedes Intervall, wenn "i" Reihen und "j" Spalten sind, folgendes berechnen:
z.b. 4er-Schritte: für Reihen: 4/1-1, danach 8/5-1, 12/9-1, ... , 32/29-1 [für alle Spalten]. (die "-1" um den Prozentwert als Dezimalzahl zu erhalten).
Wie könnte ich dafür eine Schleife basteln?

PS: Auf den Chef aufpassen Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.09.2009, 13:31     Titel:
  Antworten mit Zitat      
Hi,

kurz ein paar Sachen:

Wenn ich es richtig sehe, wird immer über 40 Werte gemittelt, also sollte man durch 40 teilen. Oder gleich die Funktion mean anwenden.

Geometrisches Mittel:
Code:
geom = reshape(prod(reshape(N, 40, 2500)).^(1/40), 50, 50);


Die Divisionsgeschichte:
Code:
M = reshape(N, 40, 2500);
verh = M(40,:)./M(1,:);


Das sollte die for-Schleife vermeiden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Sani
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.09.09
Wohnort: Neu-Ulm
Version: R2007b
     Beitrag Verfasst am: 21.09.2009, 13:53     Titel:
  Antworten mit Zitat      
Hast recht, mein Fehler

Code:


hingegen funktioniert Prima.

Du willst also von deinem TI den 2000. Wert durch denn 1. Teilen? Muss das Ergebnis wieder als 50x50 Matrix rauskommen?

Unabhängig davon würde die eine for-Schleife empfehlen.

Code:

clear all
close all
clc
N=1:1:(2000*50);                % Meine Testmatrix
N=reshape(N,2000,50);         % MeineTestmatrix

k=1;
for i=1:40:2000

erg(k,1)=N(i+39,50)/N(i,1);
k=k+1;
end
erg

 


i: Zählvariable (lokal)
k: Zählvariable (lokal)
N: deine Matrix
erg: Spaltenmatrix (Eindimensional) als Ergebnismatrix


Wenn du wie vorhin eine 50x50 Matrix haben willst musst du den Kempel am besten in eine Funktion packen und die Funktion dann im ähnlichen Stiol aufrufen wie die Teilsumme oder das Mittel...

Greez
_________________

Wer Rechtschreibfehler findet darf sie behalten.
Codefehler bitte melden Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Sani
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 03.09.09
Wohnort: Neu-Ulm
Version: R2007b
     Beitrag Verfasst am: 21.09.2009, 13:56     Titel:
  Antworten mit Zitat      
wieso über 40 werte? hab ich mich verlesen?

dache 40 reihen à 50 Werte....

Wenn ja wars mein Fehler.

Und ja Haralds idee ist natürlich viel besser als meine Dumme schleife Very Happy

danke Wink

auch was gelernt ^^
_________________

Wer Rechtschreibfehler findet darf sie behalten.
Codefehler bitte melden Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Maxius
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 21.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2009, 15:33     Titel:
  Antworten mit Zitat      
Hallo Harald, hallo Sani!

Ja, ich habe etwas geschländert mit den Dimensionen; ich lege sie nun wie am anfang erwähnt auf 2000x50 (Ursprungsmatrix) fest.
Die Ergebnismatrix soll eine 50x50 Matrix sein, da die Intervalle aus 40 Reihen bestehen.

Beide Möglichkeiten (mit oder ohne Schleife) sind cool für die Divisionsgeschichte. Jedoch hätte ich zu Harald's Vorschlag noch eine Frage:

Code:
M = reshape(N, 40, 2500);
verh = M(40,:)./M(1,:);


Ich bekomme hier ganz komische Matrixdimensionen. Ziel sollte jedoch für "verh" auch eine 50x50 Ergebnismatrix sein. Dabei soll für jedes Intervall (=50 Intervalle pro Spalte, bestehend aus je 40 Reihen) für jede Spalte (=50 Spalten gesamt) der letzte Wert des Intervalls durch den ersten dividiert weren (und dann von diesem Wert -1 subtrahiert werden>damit man den Wert als Prozentzahl hat.) >Renditeberechnung

Beispiel:
A = [1 2 3 4 ;6 7 8 9 ]'
In der Ergebnismatrix würden dann (2/1)-1 und (4/3)-1 für Spalte1 berechnet werden und (7/6)-1 und (9/Cool-1 für Spalte2

Hilft das weiter?[/code]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da habe ich etwas zu früh aufgehört:

Code:
M = reshape(N, 40, 2500);
verh = M(40,:)./M(1,:) - 1; % wenn du die -1 haben willst
verh = reshape(verh, 50, 50);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.