【问题标题】:Generating matlab array from two arrays从两个数组生成matlab数组
【发布时间】:2014-07-07 17:44:24
【问题描述】:

我有两个大型数组,我将使用以下示例进行说明。

第一个数组A是:

[ 1 21;
  3 4;
  4 12;
  5 65 ];

第二个数组B是:

[ 1 26;
  31 56;
  4 121;
  5 54 ];

我想得到最终的数组C如下:

[ 1 21 26;
  4 12 121;
  5 65 54];

即使用 A 和 B 中第一列的公共元素筛选出我要从数组 A 和 B 中提取的行并生成 C。

【问题讨论】:

    标签: arrays matlab matching


    【解决方案1】:

    使用ismember的双输出版本:

    [ii jj] = ismember(A(:,1), B(:,1));
    C = [ A(ii,:) B(jj(ii),2) ];
    

    请注意,第二行中的ii 是逻辑index,而jj(ii) 是标准(整数)索引。

    【讨论】:

    • 恭喜路易斯!你的第 1000 个答案!
    • 哦,真的吗?哇!谢谢大家!!
    【解决方案2】:

    bsxfun 方法-

    %// Slightly bigger and not-so-straightforward example to avoid any confusion
        A =[ 1 21;
        3 4;
        4 12;
        8 10
        5 65]
    
    B = [ 1 26;
        31 56;
        4 121;
        5 54
        9 99
        8 88]
    
    binmat = bsxfun(@eq,A(:,1),B(:,1).');%//'
    [v1,v2] = max(binmat,[],2);
    C = [A(any(binmat,2),:) B(nonzeros(v1.*v2),2:end)]
    

    输出 -

    A =
         1    21
         3     4
         4    12
         8    10
         5    65
    
    B =
         1    26
        31    56
         4   121
         5    54
         9    99
         8    88
    
    
    C =
         1    21    26
         4    12   121
         8    10    88
         5    65    54
    

    【讨论】:

    • 如果B 的最后两行互换,我们的方法会给出不同的结果。 OP应该已经澄清了。但从措辞看来,顺序并不重要?
    • ... 或者您在bsxfun 中缺少.'
    • 是的,可能就是这样!谢谢!我的系统运行缓慢,我打开了大约 30 个标签!现在我需要做更多的处理。
    • 我认为你需要一个any(因为ind现在是一个列):C = [A(any(ind),:) B(...,2:end)]。要索引到B,您可能还需要一些更改; any(ind) 可能不起作用
    • 如果没有bsxfun,派对就不一样了:-)
    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多