Как я могу векторизовать следующие циклы в Matlab? - PullRequest
0 голосов
/ 10 апреля 2019

Я использую matlab R2019a.У меня есть матрица, которую я хочу заполнить значениями в определенных позициях, основываясь на вычислении, сделанном на 2 дополнительных векторах.В настоящее время я делаю это с 2 циклами, но это не использует возможности векторизации Matlab.

Как следующий скрипт может быть выполнен в векторизованном виде:

C = zeros(size(vecB), size(vecA));

% Calculate face-vertix connectivity of face area values:
posMat = sparse(A, repmat((1:size(A,1))',1,3), ...
                1, size(B,1), size(A,1));

for i = 1:size(B,1)
    for j = 1:size(A,1)
        if posMat(i,j) == 1
            C(i,j) = vecA(j)/vecB(i)/3;
        end
    end
end

Размерыпеременных в скрипте:

size(A)  =         5120           3
size(B)  =         2562           3
size(B)  =         2562        5120
size(posMat)  =    2562        5120
size(vecA) =       5120           1
size(vecB) =       2562           1

1 Ответ

3 голосов
/ 10 апреля 2019

Поскольку условие внутри вашего цикла выполняется только ненулевыми элементами posMat, для эффективности важно использовать тот факт, что эта матрица sparse в векторизованной реализации.

Если вы используете умножение на условие sparse в качестве средства установки элементов, которые не удовлетворяют условию, равными 0 (вместо инициализации матрицы с использованием zeros), тогда будут оцениваться только те элементы, которые проходят условие.

Начиная с R2016b, vecA.'./vecB/3 - это , неявно расширенный для возврата полного 2562×5120 double array из vecA(j)/vecB(i)/3 для всех значений i и j.Но (posMat == 1) .* vecA.'./vecB/3 возвращает 2562×5120 sparse double array, где деление было оценено только для элементов, где posMat == 1.

Если значение sparse C, если приемлемо, то

C = (posMat == 1) .* vecA.'./vecB/3;

будет достаточно.Если требуется форма полного хранения, этот вывод можно просто передать в функцию full.

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