Matlab 使用ismember和索引从一个向量到另一个向量获取值
我有两个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中匹配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
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]