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:
%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);
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.
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
_________________
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:
% 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;
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};
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.
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
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
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.