从union和两个数组的替换生成matlab数组

时间:2015-05-22 17:01:09

标签: arrays matlab

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

第一个数组A是:

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

第二个数组B是:

[ 3 56;
  5 121];

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

[ 1 21;
  3 56;
  4 12;
  5 121 ];

即。在可用时用B的元素替换A的第二列。

我正在使用Matlab 2007。

1 个答案:

答案 0 :(得分:2)

MATLAB解决方案

使用ismember -

C = A;
[is_present,pos] = ismember(A(:,1),B(:,1))
C(is_present,2) = B(pos(is_present),2)

或使用bsxfun替换ismember -

[is_present,pos] = max(bsxfun(@eq,A(:,1),B(:,1).'),[],2);

示例运行 -

>> A,B
A =
     1    21
     3     4
     4    12
     5    65
B =
     3    56
     5   121
     4    66
>> C = A;
[is_present,pos] = ismember(A(:,1),B(:,1));
C(is_present,2) = B(pos(is_present),2);
>> C
C =
     1    21
     3    56
     4    66
     5   121

奖励:NUMPY / PYTHON解决方案

您可以将boolean indexingnp.in1d -

一起使用
import numpy as np

mask = np.in1d(A[:,0],B[:,0])
C = A.copy()
C[mask] = B

示例运行 -

In [34]: A
Out[34]: 
array([[ 1, 21],
       [ 3,  4],
       [ 4, 12],
       [ 5, 65]])

In [35]: B
Out[35]: 
array([[  3,  56],
       [  5, 121]])

In [36]: mask = np.in1d(A[:,0],B[:,0])
    ...: C = A.copy()
    ...: C[mask] = B
    ...: 

In [37]: C
Out[37]: 
array([[  1,  21],
       [  3,  56],
       [  4,  12],
       [  5, 121]])