bsxfun是否可用于稀疏矩阵



我想把逐个元素的二进制运算应用到大型逻辑向量上。这些向量的内容基本上是假的,因此出于性能考虑,最好使用稀疏矩阵。如果我这样做,得到的矩阵是不正确的。

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))

相关内容

  • 没有找到相关文章

最新更新