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

Matrixlaenge mit Faktor anpassen (Grund: Problem mit Plot)

 

Edwin
Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 05.11.2010, 17:16     Titel: Matrixlaenge mit Faktor anpassen (Grund: Problem mit Plot)
  Antworten mit Zitat      
Hallo,

wie der Titel schon sagt, moechte ich gerne die Laenge einer Matrix mit einem Faktor der Laenge einer anderen Matrix anpassen, um diese miteinander plotten zu koennen.


Code:

A = [ 1; 2; 3; 4; 5; 6 ];
B = [ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12 ];

 


Herauskommen soll fuer A :
Code:

A = [ 1; 1; 2; 2; 3; 3; 4; 4; 5; 5; 6; 6 ]
 


Ziel ist es A und B gemeinsam zu plotten bzw eine weitere Matrix fuer weitere Analysen zu erzeugen.

Gibt es einen Befehl fuer eine solche Operation?

Mit einer Schleife koennte ich das hinbiegen, aber das waere ein wenig umstaendlich finde ich...


Vielen Dank!

Gru[e,
Edwin
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: 06.11.2010, 01:03     Titel: Re: Matrixlaenge mit Faktor anpassen (Grund: Problem mit Plo
  Antworten mit Zitat      
Hallo Edwin,

Zitat:
wie der Titel schon sagt, moechte ich gerne die Laenge einer Matrix mit einem Faktor der Laenge einer anderen Matrix anpassen, um diese miteinander plotten zu koennen.

Man kann natürlich auch Vektoren unterschiedlicher Länge in eine AXES zeichnen lassen:
Code:

A = [ 1; 2; 3; 4; 5; 6 ];
B = [ 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12 ];

AxesH = axes('nextplot', 'add');
plot(1:12, B, 'b');
plot(linspace(1, 12, 6), A, 'g');
 

Ansonsten kannst Du per INTERP1 einen Vektor "aufblähen". Die 'nearest'-Methode ist wohl für Dich passend.

Oder Du erstellst einen Index-Vektor manuell:
Code:

A = [ 1; 2; 3; 4; 5; 6 ];
index = round(linspace(1, 6, 12));
A2 = A(index);
 

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 08.11.2010, 18:55     Titel:
  Antworten mit Zitat      
Herzlichen Dank Jan!

Mit dem manuellen Index-Vektor komme ich auf ein Ergebnis.

Leider habe ich nicht ganz die Anwendung von INTERP1 verstanden, diese moechte ich jedoch wenigstens einmal ausprobieren. Das Schaubild in der Hilfe zu INTERP1 laesst mich auf folgendes schlie]en:

Code:

A = [ 1.3; 2.5; 3.2; 4.7; 5.6; 6.4 ]
B = [ 1.8; 2.3; 3.3; 4.5; 5.3; 6.1; 7.9; 8.2; 9.7; 10.4; 11.5; 12.5 ];

A2 = interp1( 1:numel(A), A, 1:numel(B), nearest);

 


Aber dieser Befehl funktioniert so nicht ('error in...'). Irgendwo liegt hier ein Denkfehler vor der mir nicht auffaellt
Sad

Jan S, hast du einen weiteren Tipp hierfuer?


Vielen Dank!
Edwin
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: 09.11.2010, 00:51     Titel:
  Antworten mit Zitat      
Dear Edwin,

Code:

A = [ 1.3; 2.5; 3.2; 4.7; 5.6; 6.4 ]
B = [ 1.8; 2.3; 3.3; 4.5; 5.3; 6.1; 7.9; 8.2; 9.7; 10.4; 11.5; 12.5 ];

A2 = interp1(1:numel(A), A, ...
                     linspace(1, numel(A), numel(B)), 'nearest');
 

Erklärung: INTERP1(X, Y, XI)
Die Werte Y wurden an den Stellen X gemessen. Nun sollen die Werte zu den Stellen XI berechnet werden. Deshalb muss für Deinen Fall XI aus NUMEL(B) Punkten innerhalb des Intevalls 1:NUMEL(A) bestehen.

Zitat:
Aber dieser Befehl funktioniert so nicht ('error in...').

Bitte poste immer die vollständige Fehlermeldung. Sie enthält alle Informationen, die nötig sind, um den Fehler zu verstehen und zu beheben!

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 09.11.2010, 14:41     Titel:
  Antworten mit Zitat      
Vielen Dank Jan S fuer die schnellen Antworten, jetzt funktioniert es!

Die Errormeldung war folgende
Code:
Error in ==> test_loeschen at 10
A2 = interp1( 1:numel(A), A, 1:numel(B), nearest);



Grueße,
Edwin
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: 09.11.2010, 16:39     Titel:
  Antworten mit Zitat      
Hallo Edwin,

Schön, dass es jetzt funktioniert.

Die Fehlermeldung ist übrigens wohl immer noch unvollständig. Dies zeigt nur die Zeile, in der der Fehler auftrat, aber nicht die eigentliche Meldung.:
Code:
Error in ==> test_loeschen at 10
A2 = interp1( 1:numel(A), A, 1:numel(B), nearest);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 31
Anmeldedatum: 27.09.10
Wohnort: Charleston, SC
Version: 2009b
     Beitrag Verfasst am: 07.01.2011, 19:08     Titel:
  Antworten mit Zitat      
Hallo,

zu den oben benannten Problem habe ich nun eine Rueckfrage.
Ich komme naemlich so langsam an ein "memory"-Problem von MatLab.

Mit einem Extrapolationsfaktor moechte ich naemlich die Datenmenge einer Matrix vergroe&ern. Das funktioniert mit den bisher Extrapolationsfaktoren und Matrixlaengen ganz gut (extrapol = 5...8750).



Code:
extrapol =  input('Input the "Extrapolationsfaktor": ');
         sample_rate = numel(sek1_stat_mat(1,1:end))  ;
         sampel_rate_extrapol = (numel(sek1_stat_mat(1,1:end)) * extrapol);
       

            idx_d = round(linspace(1, sample_rate, sampel_rate_extrapol));
            % get the enlarged matrices:
            sek1_max_mat = sek1_max_mat(idx_d);
            sek1_min_mat = sek1_min_mat(idx_d);
            sek1_avg_mat = sek1_avg_mat(idx_d);


Mit den neuen Matrizen (_max_, _min_, _avg_) moechte ich ein semilogx-Plot erzeugen. Dafuer muss ich die drei Matrizen in eine 'gro&e' Matrix speichern:
Code:
   y_max1 = sort(sek1_max_mat,'descend');
    y_min1 = sort(sek1_min_mat,'descend');
    y_avg1 = sort(sek1_avg_mat,'descend');
   
    y_ges1(1,:) = y_max1;
    y_ges1(2,:) = y_min1;
    y_ges1(3,:) = y_avg1;


Dies funktioniert mit relativ kleinen Matrixlaengen wie gesagt ganz gut, jedoch bei gro&en (siehe unterhalb der Errormeldung) bekomme ich folgende Errormeldung:
Code:
Input the "Extrapolationsfaktor": 5000
??? Out of memory. Type HELP MEMORY for your options.

Error in ==> num_of_stroke_against_sek_V11 at 232
data_all_avg2{1, count} = y_ges2(3,:);
 
>> numel(y_ges1(3,:))

ans =

     4775000

>> numel(y_ges1(2,:))

ans =

     4775000

>> numel(y_ges1(1,:))

ans =

     4775000



Gibt es eine andere Moeglichkeit die Datenlaenge einer Matrix mit einem Faktor zu beeinflussen bzw. eine Memory-sparsamere-Variante?
Weil die sortierten und "verlaengerten" Daten spaeter zusammengefasst werden, moechte ich wiederrum alle zusammengehoerenden Matrizen in einer 'gro&en' Matrix speichern (hier z.B. data_all_avg2). D.h. mein Problem liegt anscheinend in der Maximallaenge die eine Matrix enthalten kann.



Vielen Dank!

MfG
Edwin
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: 07.01.2011, 23:34     Titel:
  Antworten mit Zitat      
Hallo Edwin,

Die Zahl 4775000 wirkt nicht besonders groß. Aber wenn Dein Speicher voll ist, solltest Du per WHOS-Befehl herausfinden, wer den Speicher den belegt.

Code:
Input the "Extrapolationsfaktor": 5000
??? Out of memory. Type HELP MEMORY for your options.

Error in ==> num_of_stroke_against_sek_V11 at 232
data_all_avg2{1, count} = y_ges2(3,:);
 

Dies könnte auch bedeuten, dass "count" aus Versehen gigantisch gewählt worden ist.

Übrigens:
[code]
>> numel(y_ges1(3,:))
ans = 4775000
>> numel(y_ges1(2,:))
ans = 4775000
...[/qcode]
NUMEL(X(1, :)) und NUMEL(X(2, :)) sind immer gleich groß!

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