Как ускорить / избежать умножения для больших матриц в Matlab? - PullRequest
3 голосов
/ 29 марта 2011

Настройка здесь.

X: 6000x8000 не разреженная матрица

B: разреженный вектор 8000x1 с десятками ненулевых элементов

d: положительное число

M: является разреженным X'X, то есть пороговое значение элементов, меньших d по величине, должно быть равно 0. Остались только сотни элементов. Таким образом, (X '* X - M) имеет много мелких элементов и не является разреженным.

Я хочу вычислить вектор y = (X '* X - M) * B и могу переписать как y = X' * (X * B) - M * B. Первая часть достаточно быстрая, но вторая включает в себя X '* X и очень очень медленная.

Может ли кто-нибудь помочь мне ускорить это вычисление?

Спасибо миллион!

1 Ответ

1 голос
/ 29 марта 2011

Вы объясняете, что B очень мало: десятки ненулевых значений в массиве столбцов длиной 8000. В результате, я думаю, вы можете ускорить умножения на B следующим образом. Во-первых, вы можете найти индексы ненулевых значений в B:

nzIndex = find(B);

Затем вы можете изменить вычисление y следующим образом:

Bnz = B(nzIndex);  %# Non-zero values in B
y = X.'*(X(:,nzIndex)*Bnz) - M(:,nzIndex)*Bnz;
...