Можно ли использовать bsxfun с разреженными матрицами - PullRequest
8 голосов
/ 08 декабря 2011

Я хочу, чтобы поэлементная двоичная операция применялась к большим логическим векторам.Содержимое этих векторов ложно по-человечески, поэтому из соображений производительности лучше работать с разреженными матрицами.Если я это сделаю, полученная матрица будет неправильной.

Пример

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.

1 Ответ

5 голосов
/ 08 декабря 2011

Я могу воспроизвести это, так что это определенно похоже на ошибку 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

Итак, я бы доложил об этом в 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))
...