#for-loop #sequence #octave
Вопрос:
Я пытаюсь создать скрипт, который заполняет массив путем перебора частоты каждого импульса 0-50 Гц и его рабочего цикла 0-100%.
Последовательность должна выглядеть следующим образом:
Freq Duty Cycle
1.00 0
1.01 0
1.02 0
...
1.00 1
1.01 1
1.02 1
...
1.00 2
1.01 2
1.02 2
У меня есть for
цикл для первой части:
T = [];
num_of_values=0
for freq = 1:.01:2
num_of_values = num_of_values 1;
T = [T; num_of_values freq]; %append to table
end
Что дает мне:
1 1.00
2 1.01
3 2.02
...
Примечание: Я добавил приращение в начале, чтобы увидеть, сколько создано чисел.
У меня возникли проблемы с подключением цикла for
рабочего цикла в цикле.
Также есть ли способ векторизовать это, чтобы не использовать явные циклы?
Я попытался добавить for
сюда цикл рабочего цикла, но я не получаю результат, который я пытаюсь получить:
T = [];
num_of_values = 0
for freq = 1:.01:2
num_of_values = num_of_values 1;
for duty_cycle = 0:1:2
end
T = [T; num_of_values freq duty_cycle]; %append to table
end
Комментарии:
1. Я не уверен, куда вы направляетесь от 0 до 50 Гц
Ответ №1:
Вы действительно не должны иметь привычки перераспределять массив известного размера в цикле.
Первый столбец-это просто повторение частоты N раз. Скажем, N равно 100 для каждого рабочего цикла. Вы можете вычислить это с repmat
помощью или kron
. Второй столбец-это N рабочих циклов, каждый из которых повторяется для частот, с помощью которых вы можете вычислить kron
.
f = [0:0.01:50]';
ds = [0:100]';
m = numel(f);
n = numel(ds);
result = [repmat(f, n, 1) kron(ds, ones(m, 1))]
Ответ №2:
Цикл рабочего цикла должен быть снаружи, затем вы проходите через частоту внутри. Вы должны иметь возможность инвертировать порядок столбцов в матрице, не инвертируя порядок циклов.
Вот так:
T=[];
duty_cycle=0
num_of_values=0
for duty_cycle = 0:1:100
for freq = 1:.01:2
num_of_values=num_of_values 1;
T=[T;num_of_values duty_cycle freq]; %append to table
end
end
T(1:5, :)
T(100:105, :)
T(200:205, :)
Результат:
ans =
1.0000 1.0000 0
2.0000 1.0100 0
3.0000 1.0200 0
4.0000 1.0300 0
5.0000 1.0400 0
ans =
100.0000 1.9900 0
101.0000 2.0000 0
102.0000 1.0000 1.0000
103.0000 1.0100 1.0000
104.0000 1.0200 1.0000
105.0000 1.0300 1.0000
ans =
200.0000 1.9800 1.0000
201.0000 1.9900 1.0000
202.0000 2.0000 1.0000
203.0000 1.0000 2.0000
204.0000 1.0100 2.0000
205.0000 1.0200 2.0000
Комментарии:
1. Как это что-то векторизует?
2. Это не. Это просто показывает, как заполнить матрицу запрошенными значениями с помощью цикла. Ваше решение намного чище, но я получаю
horizontal dimensions mismatch
ошибку с текущим кодом.3. Хороший улов. Исправлено сейчас