внедрите своя собствена функция 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 в израза, но изглежда сте направили това за оператора на втората степен на 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) *t).^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