Tob*_*Heß 8 matlab sparse-matrix bsxfun
我希望逐元素二元运算适用于大型逻辑向量.这些向量的内容是男子气概,因此出于性能考虑,最好使用稀疏矩阵.如果我这样做,结果矩阵是不正确的.
Examble
A = logical([0;1;0;0]);
B = logical([0 0 1 1]);
C = bsxfun(@and,A,B)
Run Code Online (Sandbox Code Playgroud)
在这种情况下C是
C =
0 0 0 0
0 0 1 1
0 0 0 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
如果我使用稀疏矩阵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
Run Code Online (Sandbox Code Playgroud)
这显然是错的.
我是否监督某事或这是一个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
Run Code Online (Sandbox Code Playgroud)
所以,我会向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))
Run Code Online (Sandbox Code Playgroud)