Можно ли использовать bsxfun с разреженными матрицами?

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

Пример

A = logical([0;1;0;0]);
B = logical([0 0 1 1]);

C = bsxfun(@and,A,B)

В этом случае С

 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.


person Tobias Heß    schedule 08.12.2011    source источник


Ответы (1)


Я могу воспроизвести это, так что это, безусловно, ошибка 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))
person Nzbuu    schedule 08.12.2011
comment
Да, я тоже думаю, что это ошибка, я узнал, что C = full(bsxfun(@and,double(sparse(A)),double(sparse(B)))) тоже будет работать. -- Спасибо за подсказку с ndgird. Я не знал об этой функции. - person Tobias Heß; 08.12.2011
comment
Также есть meshgrid, который очень похож. - person Nzbuu; 08.12.2011
comment
Кажется, исправлено в R2012a - person Nzbuu; 27.06.2013