使用ismember和indexing从一个向量获取值到另一个向量

时间:2017-12-20 13:49:32

标签: matlab

我有2个Ids向量,我们称之为a_id(10000 x 1)& b_id(4500 x 1)。

我还有一个数值向量,我们称之为b_num(4500 x 1)。 b_num中的值对应于b_id中的id。

最后我有一个向量让我们称之为a_num,它是(10000 x 1),其中没有值。我想用b_num中的值填充它,其中id匹配a_id和b_id。

a_id         b_id              b_num
ADA          BHN               2
PLB          ADA               4
BHN          LMK               3
LMK

所以结果看起来如下,

a_id        a_num
ADA         4
PLB         0
BHN         2
LMK         3

我正在尝试使用ismember但是非常高兴。

a_num = NaN * ones(length(a_id(:, 1)), 1);    

[found, pos] = ismember(a_id, b_id);

a_num(found(found~=0), 1) = b_num(pos(pos~=0), 1);

结果是

a_id        a_num
ADA         4
PLB         2
BHN         3
LMK         NaN

2 个答案:

答案 0 :(得分:2)

首先,您可以使用与NaN相同的输入参数ones,因此请使用

初始化您的a_num
a_num = NaN(size(a_id)); % Use size instead of length for clarity. length(x) = max(size(x))

ismember开始工作

我们可以在a_id中找到b_id的所有索引,并像这样分配

[bfound, idx] = ismember(a_id, b_id); % Find a_id members in b_id
a_num(bfound) = b_num(idx(bfound));   % Assign matched values
% output [4 NaN 2 3]

使用intersect

您可以使用intersect的索引参数来避免某些逻辑索引。初始化a_num之后......

[~, a_idx, b_idx] = intersect(a_id, b_id); % indices of b in a and a in b
a_num(a_idx) = b_num(b_idx);
% output [4 NaN 2 3]

答案 1 :(得分:1)

这是你想要的吗? ismember似乎工作正常。我想您只是错过了使用代码的found部分(我的idxa)。这是一个逻辑数组,因此您不需要执行此操作found(found~=0)

>> a_id  ={ 'ADA' 'PLB' 'BHN' 'LMK'};
>> b_id = {'BHN' 'ADA' 'LMK'};
>> b_num = [2 4 3];

>> [idxa idxb] = ismember(a_id,b_id)
idxa =
     1     0     1     1    
idxb =
     2     0     1     3

>> a_num = zeros(size(a_id));    
>> a_num(idxa) = b_num(idxb(idxb~=0))
a_num =

     4     0     2     3

注意:如果您愿意,请在初始化zeros()中将nan()替换为a_num