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

Vektorzerlegung

 

Fabian Baumgarten
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 27.08.12
Wohnort: ---
Version: R2012a 7.14.0.739
     Beitrag Verfasst am: 27.01.2015, 13:50     Titel: Vektorzerlegung
  Antworten mit Zitat      
Hi,
Ich hoffe, der Titel ist nicht irreführend. mir ist leider nichts besseres eingefallen...sorry.

Ich hänge nun schon eine ganze Zeit an einem doch recht simplen Problem fest. Aber irgendwie sehe Ich den Wald vor lauter Bäumen nicht.

PROBLEM:
Ich habe zwei gleich große Vektor aus einer Messreihe mit ca. 3000 bis 4000 Einträgen. Die beiden Vektoren möchte Ich miteinander Vergleichen. An den Stellen, wo sich beide Vektoren gleichen, möchte Ich die Einträge in einem separaten Vektor speichern. Die ungleichen Stellen sollen "eliminiert" werden.

Der Übersicht halber hier mal ein einfacher test mit 2 12x1 Vektoren:
Code:
%Datensammlung test

x=[1,2,3,4,5,6,7,8,9,10,11,12]';
x_n=[1,2,3,4,5,0,0,8,9,10,11,0]';

a=zeros(length(x),1);
b=0;

for i=1:length(x)
    if x(i,1)==x_n(i,1)
        a(i,1)=1;
    elseif x(i,1)~=x_n(i,1)
        a(i,1)=0;
    end
end

%a=[1,1,1,1,1,0,0,1,1,1,1,0]';
%Das sollte eigentlich rauskommen. bekomme das mit Schleifen und Indizes aber nicht hin...
%x_n1=x_n(1:5);
%x_n2=x_n(8:11);


for i=1:length(a)
   
       
        if a(i,1)==1
            b=b+1;
        end
       
        if a(i,1)==0
            break
        end
       
       
   
end

x_n1=x_n(1:b);

 


echt umständlich...und es funktioniert auch nur, bis sich die Werte der 2 Vektoren das erste mal unterscheiden. Die Schleife sollte aber eigentlich weiterlaufen und jedes Mal einen neuen Vektor schreiben, sobald sich die Einträge der beiden Vektoren wieder nicht mehr gleichen.

Ich hoffe, es wurde halbwegs verständlich, was Ich erreichen will.

mfg. Fabian
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: 27.01.2015, 14:04     Titel:
  Antworten mit Zitat      
Code:
x=[1,2,3,4,5,6,7,8,9,10,11,12];
x_n=[1,2,3,4,5,0,0,8,9,10,11,0];
a=(x==x_n);

den ersten teil kann man auch einfach ohne schleife lösen.
beim zweiten teil versuchst du einen index im variablen namen zu verstecken. das ist sehr schlecht. es ist nicht nur schwer zu generieren sondern verhindert auch das man damit leicht weiter arbeiten kann. viel einfacher wäre es die daten in einem cell array zu speichern.
mit find kannst du die nullen in deinem vektor a finden. wenn du diff über a laufen lässt kannst du sogar die stellen finden bei denen der üpbergang von 0 auf 1 auftritt und umgekehrt. das musst du dann nur noch in einer schleife abarbeiten.
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Fabian Baumgarten
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 27.08.12
Wohnort: ---
Version: R2012a 7.14.0.739
     Beitrag Verfasst am: 27.01.2015, 16:40     Titel:
  Antworten mit Zitat      
danke schon mal für die tips

hier mal eine überarbeite version des codes (noch ohne die verbesserungsvorschläge)

das hier funktioniert schon mal, ist nur sehr umständlich programmiert und ich habe das problem mit den sich ändernden variablen namen, wie bereits von Winkow angesprochen:

update1: Cell-Array...schon deutlich kürzer die Geschichte:

Code:
%% Datensammlung test

x=[1,2,3,4,5,6,7,8,9,10,11,12]';
x_n=[1,2,3,4,5,0,0,8,9,10,11,0]';
x_nn=cell(length(x),1);


a=zeros(length(x),1);
b=0;
j=0;
c=0;

% Erstellen von a: 1=Einträge von x und x_n gleich
%                  0=Einträge von x und x_n ungleich
for i=1:length(x)
    if x(i,1)==x_n(i,1)
        a(i,1)=1;
    elseif x(i,1)~=x_n(i,1)
        a(i,1)=0;
    end
end

% Erstellen einer Cell-Arrays "x_nn" mit den Einträgen aus x und x_n, die
% gleich sind. Dabei wird für jede "Serie" von gleichen Werten eine neue
% Zelle erzeugt.
for i=1:length(a)
    if  a(i,1)==1
        b=b+1;
           
    end
       
    if  a(i,1)==0 && b~=0
        j=j+1;
        x_nn{j,1}=x_n(i-b:i-1,1);
        b=0;
    end
end

% Kürzen der leeren Zelleinträge
x_nn=x_nn(1:j);

% Erzeugen von Vektoren x_n1...x_n? aus den Spalten des Cell-Arrays x_nn
x_n1=x_nn{1,1};
x_n2=x_nn{2,1};

% löschen von Hilfsvariablen
clearvars a b c i j x_nn


Bei dem Teil bräuchte ich noch Hilfe. Auch wenn es schwierig ist und damit schlecht weitergearbeitet werden kann, bräuchte Ich an der Stelle eine Funktion/Schleife etc. die automatisch variablen x_n1 bis x_n? erzeugt
wie im eröffnungsthread geschrieben, ist das mit den 12 zahlen hier nur ein beispiel. Ich habe jewils 3000 bis 4000 Werte und weiss nicht wie viele Vektoren x_n1 bis x_n? Ich nachher rausbekomme.
Code:
% Erzeugen von Vektoren x_n1...x_n? aus den Spalten des Cell-Arrays x_nn
x_n1=x_nn{1,1};
x_n2=x_nn{2,1};
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 27.01.2015, 17:23     Titel:
  Antworten mit Zitat      
Hallo Fabian,
Winkow hat Folgendes geschrieben:
beim zweiten teil versuchst du einen index im variablen namen zu verstecken. das ist sehr schlecht. es ist nicht nur schwer zu generieren sondern verhindert auch das man damit leicht weiter arbeiten kann. viel einfacher wäre es die daten in einem cell array zu speichern.

Dies solltest du dir zu Herzen nehmen.

Code:
x=[1,2,3,4,5,6,7,8,9,10,11,12, 17, 17]';
x_n=[1,2,3,4,5,0,0,8,9,10,11,0, 17, 17]';

a           = x==x_n;   % 1 für x(i)==x_n(i), sonst 0
values_a    = x(a);     % gesuchte Werte
idx_a       = find(a);  % deren Indize
idx         = find(diff(idx_a) > 1);    % Lücken zw. Werten finden
start_idx   = [1; idx+1];
end_index   = [idx; size(idx_a,1)];

c = cell(size(start_idx));  % pre_allocate
for ii = 1:size(start_idx,1)
    c{ii, 1} = values_a(start_idx(ii):end_index(ii));   % Cell sinvoller als Indizes im Namen von Variablen
end

Statt x_ni nutzt man dann c{i}.

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Fabian Baumgarten
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 27.08.12
Wohnort: ---
Version: R2012a 7.14.0.739
     Beitrag Verfasst am: 28.01.2015, 12:54     Titel:
  Antworten mit Zitat      
alles klar!

besten dank für die Hilfe!
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.