Пожалуйста, поправьте меня, если в этом вопросе есть что-то неясное. У меня есть две матрицы 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.
Смежные вопросы:
- Векторизованная функция FIND с оператором if MATLAB
- Эффективный поиск ненулевых чисел из большой матрицы
- Векторизованная функция FIND с оператором if MATLAB