MATLAB按值排序两个向量

时间:2012-12-06 15:54:59

标签: matlab vector

这是一个我想要执行的相当简单的任务,但我似乎无法找到一种方法。我已经尝试过sortrows,重塑和其他解决方案,但它们都没有完全符合我的要求。

基本上,我有两个来自相同数值范围的向量,长度不等。有些值是相等的,有些则不是。 E.g。

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

我想要做的是为每个向量添加“NaNs”以“替换”另一个向量中未共享的值。所以,我希望它们看起来像:

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替换其他矢量中的所有值?这似乎是一个笨重的解决方案,虽然并非不可能。我觉得有一些更优雅的方法可以实现这个我想念的。

谢谢!

2 个答案:

答案 0 :(得分:4)

以下是使用简单地图的一种解决方案:

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;

与Rodys解决方案的比较显示此方法更快一些:

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

答案 1 :(得分: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摆脱了重复。如果您想保持所有重复,请使用手册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));