реализовать свою собственную функцию plomb в Matlab

я пытаюсь реализовать свой собственный код для plomb (потому что у меня нет Matlab 2014b), вот мой код

function [PLS,f]=plomb(x,t);
diff=t(2)-t(1);
fs=1/diff;
x_mean=mean(x);
variance=var(x);
f=fs*(0:length(x)-1)/length(x);
part1=sum(((x-x_mean).*cos(2*pi*f*t)))^2/sum(cos(2*pi*f*t).^2);
part2=sum(((x-x_mean).*sin(2*pi*f*t)))^2/sum(sin(2*pi*f*t).^2);
PLS=(part1+part2)/(2*variance);

это делается с помощью следующего сайта

http://www.mathworks.com/help/signal/ref/plomb.html?refresh=true

я проверил этот код на следующем простом синусоидальном сигнале

>> t=0:0.01:2.93;
>> x=sin(2*pi*10*t);

но я получил ошибку

[PLS,f]=plomb(x,t);
Error using  * 
Inner matrix dimensions must agree.

Error in plomb (line 7)
part1=sum(((x-x_mean).*cos(2*pi*f*t)))^2/sum(cos(2*pi*f*t).^2);
 i did not get point,what i am doing incorrectly?thanks in advance

ОТРЕДАКТИРОВАНО:

я изменил свой код на это

for k=1:length(x)
part1(k)=sum(((x-x_mean).*cos(2*pi*f(k)*t)))^2/sum(cos(2*pi*f(k)*t).^2);
part2(k)=sum(((x-x_mean).*sin(2*pi*f(k)*t)))^2/sum(sin(2*pi*f(k)*t).^2);
PLS=(part1+part2)/(2*variance);
end

is it ok?


person dato datuashvili    schedule 04.03.2015    source источник


Ответы (2)


Кажется, вам нужно выполнять там поэлементные операции. Итак, сделайте это -

part1=sum(((x-x_mean).*cos(2*pi.*f.*t))).^2/sum(cos(2*pi.*f.*t).^2);
part2=sum(((x-x_mean).*sin(2*pi.*f.*t))).^2/sum(sin(2*pi.*f.*t).^2);
person Divakar    schedule 04.03.2015
comment
@rayryeng Бывает в сумасшедшие дни! ;) - person Divakar; 04.03.2015
comment
спасибо, мой друг, а как насчет смещения времени? что это? как я могу рассчитать? - person dato datuashvili; 04.03.2015
comment
@datodatuashvili Я не думаю, что смогу помочь вам с его функциональностью, я только предложил вам избавиться от ошибки измерения. - person Divakar; 04.03.2015
comment
большое спасибо, ребята, я думаю, что решил проблему смещения, я проверю это позже снова - person dato datuashvili; 04.03.2015

Похоже, что этот оператор пытается вычислить операции поэлементно, но только часть выражения делает это. В частности, f и t являются векторами, но вы пытаетесь умножить их на *, что интерпретируется как умножение матриц. Кроме того, вам не хватает оператора . для первой степени двойки в операторе, но вы, кажется, сделали это для второй степени 2 оператора.

Таким образом, вам нужно изменить два оператора на:

part1=sum(((x-x_mean).*cos(2*pi.*f.*t))).^2/sum(cos(2*pi.*f.*t).^2);
part2=sum(((x-x_mean).*sin(2*pi.*f.*t))).^2/sum(sin(2*pi.*f.*t).^2);
person rayryeng    schedule 04.03.2015
comment
я также использую такой цикл для k=1:length(x) part1(k)=sum(((x-x_mean).*cos(2*pif(k)*t)))^2/ сумма(cos(2*pif(k)*t).^2); part2(k)=sum(((x-x_mean).*sin(2*pif(k)*t)))^2/sum(sin(2*pif(k) *т).^2); PLS=(часть1+часть2)/(2*дисперсия); - person dato datuashvili; 04.03.2015
comment
точка, которую я не понял, как ввести смещение? Я имел в виду смещение времени - person dato datuashvili; 04.03.2015
comment
Этот цикл не имеет особого смысла. Вывод каждого выражения будет вектором, но вы пытаетесь присвоить этот вывод одному элементу в part1. Придерживайтесь векторных операций. - person rayryeng; 04.03.2015
comment
@datodatuashvili Добавить этот код к своему вопросу и показать нам весь код? - person Divakar; 04.03.2015