bsxfun能否与稀疏矩阵一起使用?

8

我希望对大型逻辑向量进行逐元素二进制操作。这些向量的内容主要是false,为了性能考虑最好使用稀疏矩阵进行操作。然而,如果这样做,得到的矩阵是不正确的。

示例

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的一个bug?
1个回答

5
我可以复现这个问题,所以这很可能是MATLAB的一个bug。特别是考虑到以下因素:
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))

1
是的,我也认为这是一个错误,我发现 C = full(bsxfun(@and,double(sparse(A)),double(sparse(B)))) 也可以工作。-- 谢谢你提供 ndgrid 的提示,我之前不知道这个函数。 - Tobias Heß
还有一个非常相似的函数叫做meshgrid - Nzbuu
似乎在R2012a版本中已经修复。 - Nzbuu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接