【发布时间】:2015-09-15 17:27:21
【问题描述】:
我有一个矩阵A = [a X b] 和一个向量Z = [1 X z],其中z > b。
我想找到矩阵A 的索引,其中Z 和矩阵A 的每一行具有相同的值。我知道我可以通过将ismember 应用于A 的每一行来做到这一点,但我会在不使用for 循环的情况下找到更快的解决方案。
【问题讨论】:
标签: performance matlab matrix vectorization
我有一个矩阵A = [a X b] 和一个向量Z = [1 X z],其中z > b。
我想找到矩阵A 的索引,其中Z 和矩阵A 的每一行具有相同的值。我知道我可以通过将ismember 应用于A 的每一行来做到这一点,但我会在不使用for 循环的情况下找到更快的解决方案。
【问题讨论】:
标签: performance matlab matrix vectorization
让我们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]?我想我得到了剩下的。
Z“发送”到第三维,以便可以使用bsxfun 进行扩展。有点像this case。
squeeze(any(bsxfun(@eq,A,permute(Z(:),[3 2 1])),2)) 应该可以工作。用它编辑答案。