Как использовать. * В умножении MATLAB? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь визуализировать функцию распределения вероятностей распределения Рэлея, реализуя ее самостоятельно в MATLAB, вместо использования встроенной функции raylpdf.

PDF распределения Рэлея:

enter image description here

Это моя попытка:

function pdf = rayleigh_pdf(x)
    exp_term = -1*power(x,2)/(2*std(x))
    pdf = (x*exp(exp_term))/std(x)
end

Но когда я попробую чтобы запустить его, я получаю сообщение об ошибке:

x = linspace(-10,10,100);
plot(x,rayleigh_pdf(x))

Ошибка:

Error using  * 
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of rows in the second matrix. To perform elementwise
multiplication, use '.*'.

Я не уверен, почему я получаю эту ошибку. Где мне использовать .*? А зачем это нужно?

1 Ответ

3 голосов
/ 26 мая 2020

Оператор «точка перед» позволяет выполнять поэлементно операции вместо операций по умолчанию матрица . Если вы пишете свой код без точек, высока вероятность того, что вы либо столкнетесь с ошибками измерения (например, потому что вы пытаетесь выполнить матричное умножение с несовпадающими измерениями), либо получите очень странные результаты из-за автоматической трансляции, что делает в результате вы получите матрицы неожиданных размеров.

function pdf = rayleigh_pdf(x)
    exp_term = -x.^2./(2.*std(x).^2);
    pdf = (x.*exp(exp_term))./(std(x).^2)
end

Две мелочи: сигма-квадрат обычно обозначает дисперсию, т. е. квадрат стандартного отклонения. Поэтому либо используйте std(x).^2, либо var(x).
Вместо того, чтобы писать очень многословную операцию power(x,2), вы можете просто использовать .^ для получения поэлементной мощности.

Обратите внимание, что некоторые точки являются лишними, например, когда вы уверены, что имеете дело с целыми числами (также известными как матрицы 1 -by- 1 в MATLAB). Таким образом, вы можете написать следующее, что эквивалентно:

function pdf = rayleigh_pdf(x)
    exp_term = -x.^2/(2*std(x)^2);
    pdf = (x.*exp(exp_term))/(std(x)^2)
end

т.е. точки требуются только при работе с массивами, x и exp_term здесь, а не со скалярами, такими как 2 или std(x).

...