Ваш ismember(j,A)
эквивалентен просто использованию значений A
для индексации. Таким образом, вы можете использовать это и полностью избежать функции ismember
(которая является самой медленной частью кода).
Итак, первый шаг для оптимизации -
A2=unique(A); % just in case you do not do this already
for i=1:N
for j=A2
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
Это должно Быть уже очень быстро. Циклы не плохи в MATLAB и сильно оптимизируются компилятором JIT.
Следующим шагом к оптимизации является сбор всех индексов и удаление вторичного l oop. Вы можете сделать это с помощью линейного индексирования, так что
A2=unique(A); % just in case you do not do this already
for i=1:N
PID(i,i)=sum(TFP(i,A2));
end
И, наконец, вы можете избавиться от этого, по диагонали сумма нужных столбцов:
A2=unique(A); % just in case you do not do this already
PID=diag(sum(TFP(:,A2),2));