0
A =[1;2;3;4;5]
B= [10 1 ;11 2;19 5]

我想得到

D = [1 10 ;2 11; 3 -9; 4 -9; 5 19]

也就是说,如果 A 中的某些东西在 B(:,2) 中不存在,则 D 的第 2 列应该是 -9。

如果 A 中的某些东西存在于 B(:,2) 中,我想将 B 的第 1 列的相应行放在 D 的第 2 列中。

我知道如何结合使用 ismember 和 for 和 if 来做到这一点。但我需要一种更优雅的方法,它不使用“for”来加速它。

4

4 回答 4

4

除非我遗漏了某些东西(或者A不是索引向量),否则这实际上要简单得多,不需要ismember或根本不需要find直接索引:

D = [A zeros(length(A),1)-9];
D(B(:,2),2) = B(:,1)

对于您的示例矩阵,它给出了

D =

    1    10
    2    11
    3    -9
    4    -9
    5    19
于 2013-07-26T14:33:59.043 回答
2

对于一般A

A =[1;2;3;4;6]; % Note change in A
B= [10 1 ;11 2;19 5];

[aux, where] = ismember(A,B(:,2));
b_where = find(where>0);
D = [(1:length(A)).' repmat(-9,length(A),1)];
D(b_where,2) = B(where(b_where),1);

这给

D = [ 1    10
      2    11
      3    -9
      4    -9
      5    -9 ]
于 2013-07-26T14:36:49.390 回答
1

我不确定这个解决方案的效率如何,但它避免使用任何循环,所以至少它是一个开始的地方:

D = [A -9*ones(size(A))];           % initialize your result
[tf, idx] = ismember(A, B(:,2));    % get indices of matching elements
idx(idx==0) = [];                   % trim the zeros
D(find(tf),2) = B(idx,1);           % set the matching entries in D to the appropriate entries in B

disp(E)

您提前分配矩阵以节省以后的时间(在 MATLAB 中动态构建矩阵真的很慢)。该ismember调用返回真假向量tf,显示 的哪些元素A对应于 中的某物B,以及它们对应于 中的内容的相关索引idx。问题idx是它包含一个零,任何时候ft都是零,这就是为什么我们有一行idx(idx==0) = [];来清除这些零。最后,find(tf)用于获取与目标上的匹配项关联的索引(D在本例中为行),并且我们将这些索引处的值设置为B我们想要的对应值。

于 2013-07-26T14:28:15.533 回答
0

首先创建一个临时矩阵:

tmp=[B; -9*ones(size(A(~ismember(A,B)))), A(~ismember(A,B))]
tmp =    
    10     1
    11     2
    19     5
    -9     3
    -9     4

然后用于find获取与A第二列中的元素匹配的第一行索引tmp(设计上总是有匹配)。

D=[A, arrayfun(@(x) tmp(find(tmp(:,2)==x,1,'first'),1),A)];
D =    
     1    10
     2    11
     3    -9
     4    -9
     5    19

作为第二步的替代方案,您可以简单地tmp根据其第二列进行排序:

[~,I]=sort(tmp(:,2));
D=[tmp(I,2), tmp(I,1)]
D =
    1    10
    2    11
    3    -9
    4    -9
    5    19
于 2013-07-26T14:09:43.430 回答