Не могу с уверенностью сказать, будет ли это решение более вычислительно эффективным, но стоит попробовать еще что-то ...
Если вам действительно нужно представлять свои матрицы как разреженные (т.е.слишком много памяти) и встроенное разреженное представление в MATLAB не дает желаемой производительности, тогда вы можете попытаться представить разреженные матрицы другим способом.В частности, вы можете представить их в виде матриц N-3, где первые два столбца содержат индексы строк и столбцов в матрице для всех ненулевых значений, а третий столбец содержит ненулевые значения.Вы можете преобразовать ваши данные в эту форму, используя функцию FIND примерно так:
for iMatrix = 1:numel(A)
[r,c,v] = find(A{iMatrix});
A{iMatrix} = [r c v];
end
Каждый раз, когда вам нужно вычислить взвешенную сумму этих матриц, вам сначала нужно умножить значенияпо весам:
B = A; %# Store a temporary copy of A
for iMatrix = 1:numel(B)
B{iMatrix}(:,3) = w(iMatrix).*B{iMatrix}(:,3);
end
Затем вы можете вычислить итоговую сумму, используя функцию ACCUMARRAY :
B = vertcat(B{:}); %# Convert B from a cell array to an N-by-3 matrix
result = accumarray(B(:,1:2),B(:,3));
Переменная result
в этом случае будетбыть полной матрицей.Если вам нужно, чтобы result
была разреженной матрицей, вы можете добавить дополнительные аргументы в вызове к ACCUMARRAY примерно так:
result = accumarray(B(:,1:2),B(:,3),[],[],[],true);