如何以向量化方式实现向量A与B各元素的setdiff运算并生成矩阵?
向量化实现方案
当然可以用纯向量化的方式实现,无需显式for循环,以下是两种可行的Matlab实现方法:
方法一:基于广播与逻辑索引(纯向量化)
利用Matlab的广播机制生成元素匹配的逻辑掩码,再通过索引提取并重塑结果:
A = [1 2 3 4]; B = [1 2 4]; % 生成逻辑掩码:每行对应B的一个元素,标记A中不等于该元素的位置 mask = A ~= B'; % R2016b及以上支持直接广播,旧版本用bsxfun(@ne, A, B') % 提取符合条件的元素并重塑为目标矩阵 M = reshape(A(mask), length(B), []);
执行后得到的M即为:
M = 2 3 4 1 3 4 1 2 3
方法二:基于arrayfun(隐式循环,写法简洁)
如果允许隐式循环(代码更简洁),可以用arrayfun结合setdiff,再将结果转为矩阵:
A = [1 2 3 4]; B = [1 2 4]; M = cell2mat(arrayfun(@(x) setdiff(A, x), B, 'UniformOutput', false))';
这种方法由Matlab内部处理循环,但代码层面无需编写for语句。
内容的提问来源于stack exchange,提问作者Jared Lo
相关产品推荐
相关产品推荐

