Вложено для цикла, не выводящего значения для внутреннего цикла - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть проблема с этим вложенным циклом:

eta = [1e-3:1e-2:9e-1];
HN =5;
for ii = 1:numel(eta)
    for v = 1:HN
        DeltaEta(v) = eta(ii)*6;
    end
end

Этот код дает вывод DeltaEta в виде вектора 1x5.

Однако я хочу, чтобы результат был вектором 90x5, где DeltaEta вычисляется 5 раз для каждого значения eta.

Я считаю, что проблема заключается в том, как я вкладываюпетли.

Это кажется тривиальным, но я не могу получить желаемый результат, любые выводы будут оценены.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы назначаете выходы для DeltaEta(v), где v = 1,2,..,HN.Таким образом, вы когда-либо назначаете

DeltaEta(1), DeltaEta(2), ..., DeltaEta(5)

. Вы можете решить эту проблему с помощью двумерного матричного вывода, индексируя также ii ...

eta = [1e-3:1e-2:9e-1];
HN = 5;
DeltaEta = NaN( numel(eta), HN );
for ii = 1:numel(eta)
    for v = 1:HN
        DeltaEta(ii,v) = eta(ii)*6;
    end
end
% optional reshape at end to get column vector
DeltaEta = DeltaEta(:);

Примечание,в вашем внутреннем цикле нет изменений - DeltaEta одинаково для всех значений v.Это означает, что вы можете избавиться от внутреннего цикла

eta = [1e-3:1e-2:9e-1];
HN = 5;
DeltaEta = NaN( numel(eta), HN );
for ii = 1:numel(eta)
    DeltaEta( ii, : ) = eta(ii) * 6;
end

И теперь мы можем увидеть способ действительно удалить внешний цикл

eta = [1e-3:1e-2:9e-1];
HN = 5;
DeltaEta = repmat( eta*6, HN, 1 ).';
0 голосов
/ 19 февраля 2019

Чтобы ответить на заданный вопрос, вам нужно индексировать ii, а также v:

eta = [1e-3:1e-2:9e-1];
HN =5;
for ii = 1:numel(eta)
    for v = 1:HN
        DeltaEta(ii,v) = eta(ii)*6;
    end
end

Однако в целом это плохая идея - если вы ловите себя на использовании для- циклы в MATLAB (в частности, циклы for с двойным вложением), вы должны подумать о том, может ли быть лучший способ, который использует сильные способности векторизации MATLAB.

...