Как я уже сказал в своем комментарии, я не совсем понимаю, о чем вы спрашиваете. Но, я отвечу на это, как если бы вы попросили его по телефону codereview.
Следующая не является хорошей практикой в MATLAB:
A1=24;
A2=23;
A3=23;
A4=23;
A5=10;
Есть очень мало случаев (если таковые имеются), где вы на самом деле нужно такие имена переменных. Вместо этого, следующее было бы намного лучше:
A = [24 23 23 23 10];
Теперь, если вы хотите использовать A1
, вы A(1)
вместо этого.
Эти две линии:
t=0:0.01:2.93;
k=1:1:294;
Они, конечно же размера (1x294), но когда вы делаете это таким образом, что легко получить это неправильно. Вы, конечно, получите ошибки позже, если они не того же размера, поэтому приятно убедиться, что с первого раза у вас есть это правильно, поэтому использование linspace может быть хорошей идеей. Следующая строка предоставит вам то же самое t
, как и выше. Таким образом, проще убедиться, что у вас ровно 294 элемента, а не 293, 295 или 2940 (иногда их легко пропустить).
t = linspace(0,2.93,294);
Не очень важно, но k = 1:1:294
может быть упрощено до k = 1:294
, поскольку размер шага по умолчанию 1.
Синтаксис .*
, используется для операций поэлементно. То есть, если вы хотите умножить каждый элемент вектора (или матрицы) на соответствующий элемент в другом. Поэтому, когда умножение векторов со скалярами не требуется, достаточно *
.
Опять же, не важно, но x=rand([1,length(t)]);
проще написать x=rand(1, length(t));
(без кронштейнов).
Вам не нужно индекс k
в y(k) = ...
, так как к непрерывно, начиная с 1, с шагом 1. Это поведение по умолчанию в среде MATLAB, таким образом y = ...
достаточно. Если, однако, вы хотели бы заполнить каждый другой номер от 1 до 100, вы могли бы сделать y(1:2:100)
.
Это далеко от совершенства, но, по моему мнению, большой шаг в правильном направлении:
A = [24 23 23 23 10];
f = [11.01 11.005 10 10.9]; % You might want to use , as a separator here
phi = 2*pi*(rand(1,4)-0.5);
t = linspace(0,2.93,294);
x = rand(1, length(t));
w = 2*pi*f; % For simplicity
y = A(1)*sin(w(1)*t+phi(1)) + A(2)*cos(w(2)*t+phi(2)) + ...
A(3)*sin(w(3)*t+phi(3)) + A(4)*cos(w(4)*t+phi(4))+A(5)*x;
Другой вариант:
z = [sin(w(1)*t+phi(1)); cos(w(2)*t+phi(2)); sin(w(3)*t+phi(3)); ...
cos(w(4)*t+phi(4)); x];
y = A.*z;
Это даст вам тот же y
как первый один. Имея же w
, t
и phi
, как указано выше, ниже также даст вам те же результаты:
c = bsxfun(@times,w,t') + kron(phi,ones(294,1));
y = sum(bsxfun(@times,A,[sin(c(:,1)), cos(c(:,2)), sin(c(:,3)), cos(c(:,4)), x']),2)';
Я надеюсь, что что-то здесь может помочь вам некоторые в дальнейшей работе. И, возможно, я действительно ответил на ваш вопрос. =)
что является причиной downvoting –
У меня нет downvoted, но я могу понять человека, который это сделал. На мой взгляд, этот вопрос плохо сформулирован, содержит как слишком мало, так и слишком много информации одновременно, и трудно точно понять, что вы просите. –
Скомпилирует ли эта строка? '[pxx, f] = periodogram (y, [], [], 100);' Я получаю сообщение об ошибке. – NKN