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

for Schleife vektorisieren

 

JeDi
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.01.12
Wohnort: Wilhelmshaven
Version: R2009b
     Beitrag Verfasst am: 25.01.2012, 12:13     Titel: for Schleife vektorisieren
  Antworten mit Zitat      
Ich würde gerne die for-Schleife umgehen, ist das möglich?
Code:
vector1 = ones(1,50)'; %column vector
result  = zeros(1,46)';
scalar1 = 4;

for i = 1:45
    summe = sum(vector1(i: scalar1 + i));
    result(i) = summe;
end;

%letztes Element extra
summe = sum(vector1(i+1: 50));
result(i+1) = summe;


... vielen dank!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.01.2012, 12:22     Titel:
  Antworten mit Zitat      
Hallo

mir ist nicht ganz klar, ob vector1 immer aus Einsen besteht, oder kommen dort unterschiedliche Werte auf?
Code:

result =ones(1,46)*5
 
Private Nachricht senden Benutzer-Profile anzeigen
 
JeDi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.01.12
Wohnort: Wilhelmshaven
Version: R2009b
     Beitrag Verfasst am: 25.01.2012, 12:47     Titel:
  Antworten mit Zitat      
hallo,

immer unterschiedliche (Messwerte).
die Einsen sind nur zum Beispiel ...
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.01.2012, 13:58     Titel:
  Antworten mit Zitat      
Hallo

so:

Code:

vector1  = ones(1,50)'; %column vector
scalar1 = 4;

idx      = ones(scalar1+1,length(vector1)-scalar1);
idx(:,1) = cumsum(idx(:,1));
idx      = cumsum(idx,2);

result   = sum(vector1(idx),1)
 
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: 25.01.2012, 14:50     Titel: Re: for Schleife vektorisieren
  Antworten mit Zitat      
Hallo JeDi,

das sollte mit SUM(BUFFER()) funktionieren. Ich kann es gerade nícht probieren, aber "help buffer" sollte helfen.
Mit FILTER kann man auch eine gleitende Summe berechnen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.01.12
Wohnort: Wilhelmshaven
Version: R2009b
     Beitrag Verfasst am: 25.01.2012, 15:24     Titel:
  Antworten mit Zitat      
hallo denny,

deine Idee ist gut, in die Richtung habe auch auch schon gedacht.

leider entspricht mein Beispiel nicht ganz der Realität. In Wirklichkeit sind es eher ca. 800000 Werte für vector1 und 199 für scalar1. Also so:
Code:
vector1  = ones(1,722662)'; %column vector
scalar1  = 199;

idx      = ones(scalar1+1,length(vector1)-scalar1);
idx(:,1) = cumsum(idx(:,1));
idx      = cumsum(idx,2);

result2  = sum(vector1(idx),1);


Dadurch wird anscheinend zu viel Speicher benötigt:
Code:
??? Error using ==> ones
Out of memory. Type HELP MEMORY for your options.

Error in ==> schleife1 at 18
idx      = ones(scalar1+1,length(vector1)-scalar1);
 


gibt es einen Ausweg?
Private Nachricht senden Benutzer-Profile anzeigen
 
JeDi
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.01.12
Wohnort: Wilhelmshaven
Version: R2009b
     Beitrag Verfasst am: 25.01.2012, 15:29     Titel:
  Antworten mit Zitat      
Moin Jan S,

unter help buffer finde ich in Matlab nichts Question

kannst du mir ein wenig genauer erklären, wie das mit der Filter-Funktion funktionieren soll?

(Ich bin neu in der Matlab-Programmierung ...)

... ersteinmal DANKE an alle, die sich mit mir Gedanken machen!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.01.2012, 16:05     Titel:
  Antworten mit Zitat      
Hallo

BUFFER arbeiten ähnlich wie RESHAPE, und bringt für dich nichts
mit FILTER könnte man dein Problem Tatsächlich lösen


Code:

vector1  = ones(1,50)'; %column vector
scalar1  = 4;
result    =  filter(ones(1,scalar1+1), 1,vector1);
result    = result(scalar1 +1:end);
 
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: 25.01.2012, 17:39     Titel:
  Antworten mit Zitat      
Hallo denny,

Nein, BUFFER arbeitet nicht wie RESHAPE. Es kann ein "Moving Window" mit einem Overlap erzeugen, während bei RESHAPE der Overlap immer 0 ist.
Ich werde ein Beispiel posten, wenn ich wieder Matlab laufenb lassen kann.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.01.12
Wohnort: Wilhelmshaven
Version: R2009b
     Beitrag Verfasst am: 25.01.2012, 17:53     Titel:
  Antworten mit Zitat      
Danke, so funktionierts!!!

Vllt. noch eine Frage: was bewirkt das a:
Code:



b ist der Vector mit 200 Einsen
x beinhaltet die Werte, die gleitend gemittelt werden sollen

was macht a?

die 200 Einsen werden entlang von x immer um eins verschoben?

warum werden die Werte in diesem Intervall aufsummiert? Oder ist dies gerade die Eigenschaft von filter?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.01.2012, 18:37     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Hallo denny,

Nein, BUFFER arbeitet nicht wie RESHAPE. Es kann ein "Moving Window" mit einem Overlap erzeugen, während bei RESHAPE der Overlap immer 0 ist.
Ich werde ein Beispiel posten, wenn ich wieder Matlab laufenb lassen kann.

Gruß, Jan



Ach so, habe jetzt kopiert, was du meinst
stimmt mit BUFFER funktioniert das auch so:
Code:

vector1  = ones(1,50)'; %column vector
scalar1  = 4;
result    =  sum(buffer(vector1,scalar1+1,scalar1));
result    = result(scalar1 +1:end);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.01.2012, 19:01     Titel:
  Antworten mit Zitat      
JeDi hat Folgendes geschrieben:
Danke, so funktionierts!!!

Vllt. noch eine Frage: was bewirkt das a:
Code:



b ist der Vector mit 200 Einsen
x beinhaltet die Werte, die gleitend gemittelt werden sollen

was macht a?

die 200 Einsen werden entlang von x immer um eins verschoben?

warum werden die Werte in diesem Intervall aufsummiert? Oder ist dies gerade die Eigenschaft von filter?


Ja FILTER bildet die SUMME von Bereich.
mit b wird die Fenstergröße definiert, dabei ist jedes Element aus ist Multiplikator. Also es wird im Bereich elementweise multipliziert und dann die Gesamtsumme davon gebildet.

Dazu am besten in die Doku reinschauen, da steht genauer beschrieben

a ist Divisor ...
kann aber die Arbeitsweise von Divisor nicht genau beschreiben.
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.