Matlab 使用ismember和索引从一个向量到另一个向量获取值

Matlab 使用ismember和索引从一个向量到另一个向量获取值,matlab,Matlab,我有两个id向量,让我们称它们为a_id(10000 x 1)和b_id(4500 x 1) 我还有一个数值向量,我们称之为b_num(4500x1)。b_num中的值对应于b_id中的id 最后我有一个向量,我们把它叫做_num,它是(10000 x 1),里面没有值。我想用b_num中的值填充它,其中id在a_id和b_id中匹配 a_id b_id b_num ADA BHN 2 PLB

我有两个id向量,让我们称它们为a_id(10000 x 1)和b_id(4500 x 1)

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

最后我有一个向量,我们把它叫做_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

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


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

首先,您可以将
nan
的输入参数与
的输入参数相同,因此使用

a_num = NaN(size(a_id)); % Use size instead of length for clarity. length(x) = max(size(x))
ismember
工作 我们可以在
b\u id
中找到
a\u 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
通过使用的索引参数,可以避免某些逻辑索引。初始化一个数值后,相同的

[~, 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]

可能是更合适的一组operation@excaza但我不确定这是否有效。我希望一个数组的元素数与一个数组的元素数相同。Intersect将返回一个3 x 1的数组,我相信它们是
a\u id
&
b\u id
单元格数组?@AeroEngy是的are@AeroEngy发布答案时,问题的海报会收到通知,不需要额外的评论,这些评论只会指向您的答案:)
[~, 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]