2013-11-01 2 views
7

У меня очень длинный вектор 1xr v, и очень длинный вектор w 1xs и матрица A rxs, которая является редкой (но очень большой по размеру).Не улучшает ли Matlab следующее?

Я ожидал следующее быть оптимизированы Matlab, так что я не столкнуться с проблемами с памятью:

A./(v'*w) 

но похоже, Matlab на самом деле пытается создать полный v'*w матрицу, потому что я проблемы с памятью. Есть ли способ преодолеть это? Обратите внимание, что нет необходимости вычислять все v'*w, потому что многие значения A составляют 0.

EDIT: Если бы это было возможно, один из способов сделать это будет делать A(find(A))./(v'*w)(find(A));

, но вы не можете выбрать подмножество матрицы (v'*w в данном случае) без первого расчета его и положить его в Переменная.

+1

Вы, вероятно, хотите использовать вместо [ 'spfun'] (http://www.mathworks.com/help/matlab/ref/spfun.html) -«Применить функцию к ненулевым разреженным матричным элементам» –

+0

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

ответ

6
  • Вы можете использовать bsxfun. Это дает тот же результат, как и A./(v'*w) без генерации матрицы v.'*w:

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w) 
    
  • Другая возможность: если вы хотите только ненулевые значения, используйте:

    [ii jj Anz] = find(A); 
    Anz./v(ii)'./w(jj).' 
    

    Это дает вектор-столбец, соответствующий вашей A(find(A))./(v'*w)(find(A)) , снова без генерации v.'*w. Если вам нужна разреженная матрица A./(v'*w) (вместо этого, если вектор столбца имеет ненулевые значения), используйте sparse(ii,jj,Anz./v(ii)'./w(jj).').

+0

Другой ответ «rdivide»! Очень хорошо. Но ненужное решение может потребоваться из-за проблем с памятью, но опять же вы изменили условия, которые я вижу. – chappjc

+0

@chappjc Да, так как я узнал о 'bsxfun', я стараюсь применить его ко всему :-) Я не понимаю, как переставить термины –

+0

kloop имеет' (v '* w) 'grouped, но вы можете обрабатывать их последовательно. Это характер проблемы, которую я не понимал с первого взгляда. В результате ответ на самом деле отличается от ссылки «5.8208e-11» в тестовом примере, который я только что пробовал ... ошибка точности машины, аккумулирующая, но все же крошечная. – chappjc