2016-10-10 61 views
1

我有兩個向量1x5000。它們包括數字是這樣的:兩個向量的元素比較,而忽略之間的所有NaN

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]

我想檢查數字的順序是平等的,獨立於NaN S的。但我不想刪除NaN(Not-a-Number),因爲我稍後會使用它們。所以現在我創建一個新的矢量並將其稱爲results。一旦他們按照相同的順序進來,這是正確的,我們填寫results1。如果下一個數字不相等,我們將0加到results

一個例子results是這樣的用於vec1vec2[1 1 1 0 1 0 0]

前3個數字是相同的,然後7相比1賦予0,則5相比5是真賦予1 。然後最後兩個數字是缺少給出0.

我不想刪除NaN s的一個原因是我有一個時間向量1x500,不知何故我想獲得每個1和0的時間(在一個新的向量中)。這也可能嗎?

幫助超級讚賞!

回答

3

這是我會怎麼做:

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)]; 

注意的是,這裏results是一個二進制數組。如果你需要它數字,你可以將它轉換爲雙精度。

關於您對NaN的關注,取決於您想要對陣列執行什麼操作。如果您要處理它們,那麼刪除NaN會更方便。爲了保持事物的軌道,你可以保持不停元素的索引:

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 

如果您決定刪除NaN S,該解決方案將是相同的,與所有temp s的vec取代。

+0

這似乎工作得很好,謝謝!只有一個問題,我有一個向量time1和time2。對於每個1和0,我可以拿出vec1和vec2的時間嗎?時間矢量具有相同的長度。 –

+0

我假設'time1'是每個元素對應於'vec1'中的一個元素的時間向量。然後是的,你可以用'NaN'-free'vec1'這樣的方式獲得所有時間:'newtime1 = time1(id1);' – erfan

+0

正確的時間向量,我自動想要得到每個1的時間, 0的vec1和vec2。這可以做? –

1

這將是我的解決方案,使用邏輯索引和查找功能的混合。返回1和0的時間戳實際上比找到1和0更乏味。

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