Проверка членства в массиве без для l oop в matlab - PullRequest
3 голосов
/ 19 февраля 2020

Я хочу упростить этот код для работы без l oop.

for i=1:N
    for j=1:N
        if ismember(j,A)

           PID(i,i)=TFP(i,j)+ PID(i,i);

        end
    end
end

, в которой A - это матрица, содержащая некоторые метки. Ранее я хранил TFP в виде N * N редких двойных. Итак, я пришел к следующему решению, но не смог найти способ реализовать условие членства (указано?) В этом.

PID = sum(TFP).*(?);

Может ли оно быть реализовано без oop?

Ответы [ 3 ]

6 голосов
/ 19 февраля 2020

Ваш 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));
5 голосов
/ 19 февраля 2020

Вместо суммирования результата поэлементного умножения вы можете использовать матричное умножение. Он вычисляет сумму продуктов без создания временного массива:

J = ismember(1:N, A).';
PID = diag(TFP * J);
2 голосов
/ 19 февраля 2020

Я не уверен, что полностью понимаю вашу проблему. Вы пробовали это?

j=1:N;
PID = sum(TFP).*ismember(j,A);

ismember будет работать как матрица, которая при истинном значении равна '1', что позволяет умножать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...