ДЛЯ цикла / векторизации числовой последовательности

#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. Хороший улов. Исправлено сейчас