2013-11-02 2 views
1

У меня был следующий вопрос, который похож: Doesn't Matlab optimize the following?Как сделать следующий расчет в Matlab?

, но это один сложнее вариант, и решение, предложенное там не работает.

У меня очень длинная матрица n x r V и очень длинная матрица W n x s и матрица A rxs, которая является разреженной (но очень большой по размеру).

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

A./(V'*W)

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

Если бы это было возможно, то одним из способов сделать это было бы сделать A (find (A)) ./ (V «* W) (найти (A));

, но вы не можете выбрать подмножество матрицы (V '* W в этом случае), не вычисляя сначала его и не помещая в переменную.

(Основное отличие от предыдущего вопроса:. V и W являются не только векторы, но матрицы)

+0

Быстрое предложение/тест: Можете ли вы также создавать разреженные матрицы V и W? – David

+0

'V '* W' является r x r. 'A' - это r x s. Вы не можете определить 'A ./ (V + * W)'. Вам нужно изменить некоторые размеры. Может быть, 'W' является n x s? –

ответ

1

answer к предыдущему вопросу можно обобщить, чтобы вычислить отличные от нуля значения A./(V'*W) следующим образом:

[ii jj Anz] = find(A); 
result = arrayfun(@(n) Anz(n)/(V(:,ii(n))'*W(:,jj(n))), 1:length(ii)); 

Это позволяет избежать вычисления полной матрицы V'*W, потому что он только вычисляет необходимые записи из этой матрицы (то есть те, для которых соответствующий элемент A отличен от нуля), по одному за раз. Таким образом, использование памяти остается низким. Что касается скорости, то использование arrayfun обычно медленное, но если A имеет несколько отличных от нуля значений, это не займет много времени.

Конечно, вы могли бы создать разреженную матрицу A./(V'*W) как sparse(ii,jj,result).

+0

+1 Упорство! Как вы говорите, 'arrayfun' будет не так плох, как может показаться на первый взгляд, потому что' A', как ожидается, будет скудным. – chappjc

+0

@chappjc Спасибо! Цикл может даже быть немного быстрее, чем 'arrayfun'. Но похоже, что ответ Matlab с петлей уступает в некотором смысле :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^