2012-12-06 74 views
1

這是一個相當簡單的任務,我想執行,但我似乎無法找到一種方法來做到這一點。我已經嘗試了分揀,重塑和其他解決方案,但他們都沒有做到我想要的。基本上,我有兩個相同長度不等的值的向量。有些值是相等的,有些則不相等。例如。MATLAB按值排序兩個向量

A = [1 5 20 30 53 70 92] 
B = [2 3 4 16 20 30 60 95 100] 

我想要做的是增加「的NaN」每個向量爲「站隊」的非共享中的其他矢量的值。所以,我希望他們看起來像:

A = [1 NaN NaN NaN 5 NaN 20 30 53 NaN 70 92 NaN NaN] 
B = [NaN 2 3 4 NaN 16 20 30 NaN 60 NaN NaN 95 100] 

一些方法,通過該載體將有佔位符爲其他載體的價值。

我是否結合了矢量,對它進行排序,然後以某種方式搜索並用NaN替換其他矢量中的所有值?這似乎有點笨重的解決方案,儘管並非不可能。我覺得有一些更優雅的方式來完成這一點,我失蹤了。

謝謝!

回答

4

下面是一個使用簡單的地圖一個解決方案:

與Rodys解決方案顯示
A = [1 5 20 30 53 70 92] 
B = [2 3 4 16 20 30 60 95 100] 

% map all A and B elements 
% use 1 for A and 2 for B 
map = zeros(max([A,B]),1); 
map(A) = 1; 
map(B) = bitor(map(B), 2); 

% find the values present in either A, or B 
[~,~,j] = find(map); 
AA = nan(size(j)); 
BB = nan(size(j)); 
AA(bitand(j,1)~=0) = A; 
BB(bitand(j,2)~=0) = B; 

比較這種方法有點快:

A = unique(randi(10000, 1000, 1)); 
B = unique(randi(10000, 1000, 1)); 

tic; 
for i=1:1000 
    map=zeros(10000,1); 
    map(A) = 1; 
    map(B) = bitor(map(B), 2); 
    [~,~,j] = find(map); 
    AA = nan(size(j)); 
    BB = nan(size(j)); 
    AA(bitand(j,1)~=0) = A; 
    BB(bitand(j,2)~=0) = B; 
end 
toc 


tic 
for i=1:1000 
    C = union(A,B); 
    Ap = NaN(size(C)); 
    Ap(ismember(C,A)) = A; 
    Bp = NaN(size(C)); 
    Bp(ismember(C,B)) = B; 
end 
toc 

isequalwithequalnans(BB, Bp) 
isequalwithequalnans(AA, Ap) 

Elapsed time is 0.283828 seconds. 
Elapsed time is 0.457204 seconds. 

ans = 
1 

ans = 
1 
+0

可讀與快速,似乎你不能同時在Matlab中...... –

+0

這給了我一個錯誤在「[〜,〜,j] = find(map);」。告訴我這是無效的語法。 –

+0

@RyanSimmons有趣。你有什麼matlab版本? – angainor

3

好了,這裏有一個方法:

% union of sets A and B 
C = union(A,B); 

% initialize new sets, check membership, and 
% assign old values when applicable 
Ap = NaN(size(C)); Ap(ismember(C,A)) = A; 
Bp = NaN(size(C)); Bp(ismember(C,B)) = B; 

注意union擺脫repititions的。如果你想保持所有重複,使用手動sortismember第二輸出:

% combine and sort, KEEPING repetitions 
C = sort([A B]); 

% initialize new sets, check membership, and 
% assign old values when applicable 
Ap = NaN(size(C));   Bp = NaN(size(C)); 
[I,Ab] = ismember(C,A); [I,Bb] = ismember(C,B); 
Ap(I) = A(Ab(I));   Bp(I) = B(Bb(I)); 
+0

有趣的是,我實際上剛剛遇到了一個非常類似的解決方案,並且是ab當你發佈這個信息時,回答我自己的問題。不過謝謝!你的優雅比我的優雅,它嵌套在循環中。 –

+0

不知道哪一個更快;) – angainor

+0

@angainor:只有一種方法找出! –