2016-10-10 10 views
1

Ich habe zwei Vektoren 1x5000. Sie bestehen aus Zahlen wie folgt aus:Elementweise Vergleich von zwei Vektoren unter Ignorieren aller NaNs zwischen

vec1 = [NaN NaN 2 NaN NaN NaN 5 NaN 8 NaN NaN 7 NaN 5 NaN 3 NaN 4]

vec2 = [NaN 2 NaN NaN 5 NaN NaN NaN 8 NaN 1 NaN NaN NaN 5 NaN NaN NaN]

Ich möchte, wenn die Reihenfolge der Zahlen überprüfen, gleich sind, unabhängig von den NaN s. Aber ich möchte nicht die NaN s (Not-a-Number) entfernen, da ich sie später verwenden werde. Jetzt erstelle ich einen neuen Vektor und nenne ihn results. Sobald sie in der gleichen Reihenfolge kommen, ist es korrekt und wir füllen results mit 1. Wenn die nächsten Zahlen nicht gleich sind, fügen wir 0 zu results hinzu.

Ein Beispiel results, wie dies für vec1 und vec2 aussehen: [1 1 1 0 1 0 0]

Die ersten drei Zahlen gleich sind, dann wird 7 im Vergleich zu 1, die 0 ergibt, dann 5 im Vergleich zu 5 gilt, die 1 gibt . Dann werden die letzten beiden Zahlen fehlen, die 0.

ein Grund gibt, dass ich will nicht die NaN s entfernen, ist, dass ich eine Zeitvektor 1x500 haben und irgendwie möchte ich die Zeit für jeweils 1 und 0 erhalten (in einem neuen Vektor). Ist das auch möglich?

Hilfe ist super geschätzt!

Antwort

3

Dies ist, wie ich es tun würde:

temp1 = vec1(~isnan(vec1)); 
temp2 = vec2(~isnan(vec2)); 
m = min(numel(temp1), numel(temp2)); 
M = max(numel(temp1), numel(temp2)); 
results = [(temp1(1:m) == temp2(1:m)), false(1,M-m)]; 

Beachten Sie, dass hier results ein binäres Array ist. Wenn Sie es numerisch benötigen, können Sie es zum Beispiel in doppelt konvertieren.

In Bezug auf Ihre Bedenken über NaN s, hängt davon ab, was Sie mit Ihren Arrays tun möchten. Wenn Sie sie verarbeiten, ist es bequemer, die NaN s zu entfernen. Um den Überblick zu behalten können Sie den Index der Elemente gehalten halten:

id1 = find(~isnan(vec1)); 
vec1 = vec1(id1); 

vec1 = 

    2  5  8  7  5  3  4 

id1 = 

    3  7  9 12 14 16 18 

% and same for vec2 

Wenn Sie die NaN s entfernen entscheiden, wird die Lösung gleich sein, mit allen temp mit vec ersetzt s.

+0

Dies scheint perfekt zu funktionieren, danke! Nur eine Frage, ich habe einen Vektor time1 und time2. Könnte ich für jede 1 und 0 die Zeit von vec1 und vec2 rausholen? Der Zeitvektor hat die gleiche Länge. –

+0

Ich gehe davon aus, dass 'time1' ein Vektor von Zeiten ist, wobei jedes Element einem Element in' vec1' entspricht. Dann können Sie alle Zeiten des 'NaN'-freien' vec1' auf diese Weise haben: 'newtime1 = time1 (id1);' – erfan

+0

Korrekt bezüglich des Zeitvektors, ich möchte automatisch die Zeit für jede 1 und 0 der vec1 und vec2. Kann das gemacht werden? –

1

Dies wäre meine Lösung, die eine Mischung aus logischer Indexierung und Suchfunktion verwendet. Das Zurückgeben der Zeitstempel für die Einsen und Nullen ist eigentlich mühsamer als das Finden der Einsen und Nullen.

vec1 = [NaN NaN 2 NaN NaN NaN 5 NaN 8 NaN NaN 7 NaN 5 NaN 3 NaN 4]; 
vec2 = [NaN 2 NaN NaN 5 NaN NaN NaN 8 NaN 1 NaN NaN NaN 5 NaN NaN NaN]; 
t=1:numel(vec1); 

ind1=find(~isnan(vec1)); 
ind2=find(~isnan(vec2)); 
v1=vec1(ind1); 
v2=vec2(ind2); 
if length(v1)>length(v2) 
    ibig=1; 
else 
    ibig=2; 
end 
n=min(length(v1),length(v2)); 
N=max(length(v1),length(v2)); 
v=false(1,N); 
v(1:n)=v1(1:n)==v2(1:n); 

t_ones1=t(ind1(v)); 
t_ones2=t(ind2(v)); 
if ibig==1 
    t_zeros1=t(ind1(~v)); 
    t_zeros2=t(ind2(~v(1:n))); 
else 
    t_zeros1=t(ind1(~v(1:n))); 
    t_zeros2=t(ind2(~v)); 
end 
Verwandte Themen