Matlab For Loop Variable - PullRequest
       9

Matlab For Loop Variable

0 голосов
/ 28 января 2019

Я новичок в Matlab и пытаюсь понять, как будут работать циклы for.В частности, я хочу сгенерировать 100 тиражей из стандартного равномерного распределения и вычислять среднее значение каждый раз, и повторить эту процедуру 500 раз.После этого я хочу сохранить среднее значение в векторе.

Один из способов достижения этого заключается в:

U = [];
Average = [];

for i = 1:500
    U = rand(1, 100);
    Average = [Average mean(U)];
    U = [];
end

Интуиция проста.Я создаю пустой вектор для U и среднего.После этого я рисую 100 реализаций из стандартной униформы, вычисляю среднее значение, сохраняю среднее значение, очищаю вектор U и повторяю.Процедура работает, но я просто хочу уточнить одну вещь: хотя это цикл for, где i является переменной цикла, i нигде не отображается в теле.Мой вопрос: если переменная цикла не появляется в теле, просто повторяется ли процедура количество раз, равное числу приращений в 1 единицу, как указано в команде for?

1 Ответ

0 голосов
/ 28 января 2019

Строка

for i = 1:500

присваивает столбец выражения переменной на каждой итерации.Поскольку 1:500 является вектором строки, i будет принимать скалярное значение на каждой итерации.Если бы это была матрица MxN, i был бы столбцом Mx1 на каждом шаге.Количество столбцов определяет количество итераций, независимо от того, что вы делаете с переменной цикла.

Вы можете делать все, что захотите, с помощью i, в том числе игнорировать его.Фактически вы можете даже присвоить ему материал, но значение на следующей итерации будет сброшено до того, что нужно циклу.

Назначение U = []; до и в цикле не требуется.Он создает новый пустой массив, но затем сразу отбрасывает его, когда вы делаете U = rand(1, 100);. Это назначение само по себе достаточно, чтобы отбросить все, что было сохранено под именем U.

Расширение среднего значения при первой установкеэто с Average = [];, а затем обновление с Average = [Average mean(U)]; не рекомендуется.Делать это таким образом неоправданно дорого, потому что каждый раз вам приходится перераспределять память для хранения массива размером i.Лучший вариант - предварительно выделить все 500 элементов и использовать i для сохранения нужного значения в правильном индексе.Что-то вроде

Average = zeros(1, 500);
for i = 1:500
    Average(i) = mean(rand(1, 100))
end

Но, конечно, как и комментарий Криса Луенго , подразумевается, что MATLAB это все о векторизации.Это не часто, что вам действительно нужен цикл.Определенную операцию, которую вы ищете, можно выполнить, сгенерировав все нужные сэмплы в одну матрицу 100x500 и усреднив по первому измерению.

Average = mean(rand(100, 500), 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...