Векторизация параллели FOR l oop для нескольких измерений MATLAB - PullRequest
0 голосов
/ 22 марта 2020

Пожалуйста, поправьте меня, если в этом вопросе есть что-то неясное. У меня есть две матрицы pop и ben трех измерений. Назовите эти размеры как c,t,w. Я хочу повторить тот же процесс, который я опишу ниже для всех измерений c, без использования для l oop, поскольку это медленно. Для обсуждения ниже, установите значение измерения c, чтобы объяснить мое мышление, позже я дам MWE. Поэтому, когда c зафиксировано, у меня есть 2D-матрица с размером t,w.

Теперь я повторяю весь процесс (ниже!) Для всех измерений w. Если значение u равно нулю, то я нахожу следующую ненулевую запись в этом же t измерении. Я сохраняю как эту запись, так и соответствующий индекс t. Если значение u не равно нулю, я просто сохраняю это значение и соответствующий индекс t. Назовите индекс как я - обратите внимание, что я бы имел размер (c,t,w). Последняя запись каждого u(c,:,w) гарантированно не равна нулю.

Пример Если вектор u(c,:,w) равен [3 0 4 2 0 1], то соответствующие значения i равны [1,3,3,4,6,6]. Теперь я беру эти записи и определяю новый трехмерный массив измерения (c,t,w) следующим образом. Я беру свой массив B и делаю следующее, что не является правильным синтаксисом, но чтобы объяснить вам: B(c,t,w)/u(c,i(c,t,w),w). То есть я беру значения B и делю их на значения u, соответствующие ненулевым индексам u из i, которые я вычислил.

Для приведенного выше примера знаменатель будет [3,4,4,2,1,1]. Я надеюсь, что это имеет смысл !! ​​

ВОПРОС: Чтобы сделать это, поскольку этот процесс просто повторяется для всех c, я могу сделать очень быстрый векторизованный расчет для одного c. Но для нескольких c я не знаю, как избежать для l oop. Я не знаю, как делать векторизованные вычисления по измерениям. Вот что я сделал, где c_size - это размерность c.

for c=c_size:-1:1
    uu=squeeze(pop(c,:,:)) ; % EXTRACT A 2D MATRIX FROM pop.
    BB=squeeze(B(c,:,:)) ; % EXTRACT A 2D MATRIX FROM B
    ii = nan(size(uu));  % Start with all nan values
    [dum_row, ~] = find(uu);  % Get row indices of non-zero values
    ii(uu ~= 0) = dum_row;     % Place row indices in locations of non-zero values
    ii = cummin(ii, 1, 'reverse');  % Column-wise cumulative minimum, starting from bottomi
    dum_i = ii+(time_size+1).*repmat(0:(scenario_size-1), time_size+1, 1);  % Create linear index
    ben(c,:,:) = BB(dum_i)./uu(dum_i);
    i(c,:,:) = ii ;
    clear dum_i dum_row uu BB ii
end

Главный вопрос - избежать этого для l oop.

Смежные вопросы:

  1. Векторизованная функция FIND с оператором if MATLAB
  2. Эффективный поиск ненулевых чисел из большой матрицы
  3. Векторизованная функция FIND с оператором if MATLAB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...