我可以在 matlab 矩阵的每一行和没有循环的向量之间找到共同值吗?

Posted

技术标签:

【中文标题】我可以在 matlab 矩阵的每一行和没有循环的向量之间找到共同值吗?【英文标题】:Can I find common values between each row of a matlab matrix and a vector without a loop? 【发布时间】:2015-09-15 17:27:21 【问题描述】:

我有一个矩阵A = [a X b] 和一个向量Z = [1 X z],其中z > b

我想找到矩阵A 的索引,其中Z 和矩阵A 的每一行具有相同的值。我知道我可以通过将ismember 应用于A 的每一行来做到这一点,但我会在不使用for 循环的情况下找到更快的解决方案。

【问题讨论】:

【参考方案1】:

让我们bsxfun吧-

squeeze(any(bsxfun(@eq,A,permute(Z(:),[3 2 1])),2))

或者

any(bsxfun(@eq,permute(A,[1 3 2]),Z(:).'),3)

通过示例运行验证结果 -

>> A
A =
     3     9     3     1     6
     4     9     4     2     5
     1     6     8     6     5
     2     1     1     7     3
>> Z
Z =
     7     2     7     2     4     6     8
>> for ii = 1:size(A,1)
    out_loopy(ii,:) = ismember(Z,A(ii,:));
end
>> out_loopy
out_loopy =
     0     0     0     0     0     1     0
     0     1     0     1     1     0     0
     0     0     0     0     0     1     1
     1     1     1     1     0     0     0
>> squeeze(any(bsxfun(@eq,A,permute(Z(:),[3 2 1])),2))
ans =
     0     0     0     0     0     1     0
     0     1     0     1     1     0     0
     0     0     0     0     0     1     1
     1     1     1     1     0     0     0
>> any(bsxfun(@eq,permute(A,[1 3 2]),Z(:).'),3)
ans =
     0     0     0     0     0     1     0
     0     1     0     1     1     0     0
     0     0     0     0     0     1     1
     1     1     1     1     0     0     0

【讨论】:

感谢bsxfun 老师的精彩教程;)。您能否详细说明permute 中的[3 2 1]?我想我得到了剩下的。 @Adriaan 将Z“发送”到第三维,以便可以使用bsxfun 进行扩展。有点像this case 感谢您的回复,但我的问题指定错误。我实际上想知道 Z 和 A 的每一行具有共同值的 Z 的索引。所以我希望基于你的例子的解决方案是 4 x 7 @user42527 这个squeeze(any(bsxfun(@eq,A,permute(Z(:),[3 2 1])),2)) 应该可以工作。用它编辑答案。

以上是关于我可以在 matlab 矩阵的每一行和没有循环的向量之间找到共同值吗?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中的左循环移位,用于不同数量位置的矩阵的每一行

matlab for循环 改写成 矩阵算法

MATLAB中向量数组的向量范数

Matlab - 如何对两个矩阵之间的每一行执行操作?

numpy用向量减去矩阵的每一行

如何将给定矩阵的每一行中的所有元素与给定向量的相应元素相乘并在 MATLAB 中求和?