这是一个我想要执行的相当简单的任务,但我似乎无法找到一种方法。我已经尝试过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替换其他矢量中的所有值?这似乎是一个笨重的解决方案,虽然并非不可能。我觉得有一些更优雅的方法可以实现这个我想念的。
谢谢!
答案 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
摆脱了重复。如果您想保持所有重复,请使用手册sort
和ismember
的第二个输出:
% 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));