У меня относительно большая матрица NxN (N ~ 20000) и вектор Nx1, идентифицирующий индексы, которые должны быть сгруппированы вместе.
Я хочу суммировать части матрицы, которая в принципе может иметь разное количество элементов и несмежных элементов.
Я быстро написал двойной цикл for, который работает правильно, но, конечно, он неэффективен. Профилировщик определил эти циклы как одно из узких мест в моем коде.
Я попытался найти умный метод векторизации для решения проблемы. Я исследовал функции arrayfun
, cellfun
и bsxfun
и искал решения похожих проблем ... но пока не нашел окончательного решения.
Это тестовый код с двумя циклами for:
M=rand(10); % test matrix
idxM=[1 2 2 3 4 4 4 1 4 2]; % each element indicates to which group each row/column of M belongs
nT=size(M,1);
sumM=zeros(max(idxM),max(idxM));
for t1=1:nT
for t2=1:nT
sumM(t1,t2) = sum(sum(M(idxM==t1,idxM==t2)));
end
end