我可以在 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 矩阵的每一行和没有循环的向量之间找到共同值吗?的主要内容,如果未能解决你的问题,请参考以下文章