Как можно избежать этого цикла for несмотря на то, что каждый элемент должен проверяться индивидуально? - PullRequest
0 голосов
/ 06 июля 2019

Используя Matlab R2019a, есть ли способ избежать цикла for в следующем коде, несмотря на измерения, содержащие разные элементы, так что каждый элемент должен быть проверен? M - это вектор с индексами, а Inpts.payout - это пятимерный массив с числовыми данными.

for m = 1:length(M)-1
    for power = 1:noScenarios
        for production = 1:noScenarios
            for inflation = 1:noScenarios
                for interest = 1:noScenarios
                    if Inpts.payout(M(m),power,production,inflation,interest)<0
                        Inpts.payout(M(m+1),power,production,inflation,interest)=...
                            Inpts.payout(M(m+1),power,production,inflation,interest)...
                            +Inpts.payout(M(m),power,production,inflation,interest);
                        Inpts.payout(M(m),power,production,inflation,interest)=0;
                    end
                end
            end
        end
    end
end

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Довольно просто удалить внутренние 4 петли.Это будет более эффективно, если у вас не огромная матрица Inpts.payout, поскольку должна быть сгенерирована новая индексная матрица.

Следующий код извлекает две соответствующие «плоскости» из входных данных и выполняет их логику, затем записывает их обратно:

for m = 1:length(M)-1
    payout_m = Inpts.payout(M(m),:,:,:,:);
    payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
    indx = payout_m < 0;
    payout_m1(indx) = payout_m1(indx) + payout_m(indx);
    payout_m(indx) = 0;
    Inpts.payout(M(m),:,:,:,:) = payout_m;
    Inpts.payout(M(m+1),:,:,:,:) = payout_m1;
end

Можно избежать извлечения «плоскостей» и их обратной записи, работая непосредственно с матрицей входных данных.Однако это приводит к более сложному коду.

Тем не менее, мы можем легко избежать некоторых операций индексирования следующим образом:

payout_m = Inpts.payout(M(1),:,:,:,:);
for m = 1:length(M)-1
    payout_m1 = Inpts.payout(M(m+1),:,:,:,:);
    indx = payout_m < 0;
    payout_m1(indx) = payout_m1(indx) + payout_m(indx);
    payout_m(indx) = 0;
    Inpts.payout(M(m),:,:,:,:) = payout_m;
    payout_m = payout_m1;
end
Inpts.payout(M(m+1),:,:,:,:) = payout_m1;
0 голосов
/ 09 июля 2019

Кажется, что нет способа избежать этого.Я предполагаю, что каждый for lop независимо меняет переменный параметр, используемый в основном вычислении.Таким образом, требуется иметь это много для циклов.Мое единственное предложение - превратить ваши вложенные циклы в функцию, если вы беспокоитесь о внешнем виде.Не уверен, поможет ли это во время выполнения.

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