我想把逐个元素的二进制运算应用到大型逻辑向量上。这些向量的内容基本上是假的,因此出于性能考虑,最好使用稀疏矩阵。如果我这样做,得到的矩阵是不正确的。
Examble
A = logical([0;1;0;0]);
B = logical([0 0 1 1]);
C = bsxfun(@and,A,B)
在这种情况下C是
C =
0 0 0 0
0 0 1 1
0 0 0 0
0 0 0 0
如果我使用稀疏矩阵C是
C = full(bsxfun(@and,sparse(A),sparse(B)))
C =
0 0 0 0
1 1 1 1
0 0 0 0
0 0 0 0
这显然是错误的。
是我疏忽了什么还是这是一个Matlab的错误。
我可以重现这一点,所以它肯定是一个MATLAB错误。特别是考虑到:
C = full(bsxfun(@times,sparse(A),sparse(B)))
C =
0 0 0 0
0 0 1 1
0 0 0 0
0 0 0 0
所以,我会向The Mathworks报告。
然而,在这个特殊的情况下,我不禁觉得bsxfun
与稀疏矩阵不是最有效的。考虑以下内容:
A = sparse(logical([0;1;0;0]));
B = sparse(logical([0 0 1 1]));
C_bsxfun = bsxfun(@and,full(A),full(B));
[i j] = ndgrid(find(A), find(B));
C_sparse = sparse(i, j, true, numel(A), numel(B));
isequal(C_bsxfun, full(C_sparse))