我正在使用MATLAB制作一个函数,当我输入p,q和no的值时,该函数返回几何分布的概率质量函数。尝试次数(x)作为输入。
我的功能:
function Probability = Geometric(p, q, x)
Probability = p*q^x-1
现在,每当我尝试通过输入 p , q 和 x 的值来计算概率时,例如:>
Geometric(0.5, 0.5, 1),
确切的错误:
几何(0.5,0.5,1)
???类型为“ double”的输入参数的未定义函数或方法“ Geometric”。
我尝试过更改功能,并将其简化为一个输入和一个输出。
我希望概率可以计算出来,但事实并非如此。
答案 0 :(得分:2)
出了什么问题?
p*q^x-1 % Your original code
您的原始代码占用q
,将其提升为第x
次幂,再乘以p
,然后 then 减去1。这等效于遵循您肯定没有的代码。
(p*(q^x)) - 1 % What your code was doing written differently
考虑order of operations,更容易进行校正。
p*q^(x-1) % Your corrected code
另一个可能错误源是您的函数未保存为独立的m文件“ Geometric.m”,该文件也必须位于您的MATLAB路径中(MATLAB必须“查看”它)。如果您的函数文件“ MyFunction.m ”存储在一个文件夹中,则可以使用一行将其添加到MATLAB的可见路径(或手动导航到该文件夹)。有关更多详细信息,请参见how to create a function。
mypathtoMyFunction = 'C:\Users\SonnyJordan\Documents\SweetCode\FunctionFolder';
path(path,'mypathtoMyFunction')
全面解决方案(3种方法)
从Geometric distribution的参数化中,您需要{1,2,3,4,...}的支持。
两件事。 (1)我会推荐anonymous function这样的东西。 (2)确实不需要将 p 和 q 分离为单独的变量,因为 p + < em> q = 1,因此一个决定另一个(即q = 1-p
)。
方法1:匿名功能
% MATLAB R2018b
geopmfh =@(p,k) p.*((1-p).^(k-1)); % Define pmf
k = 5; % Number of trials
p = 0.2; % Prob("Success" on trial)
geopmfh(p,k) % Probability
以上代码完全是vectorized,因此您可以向其传递矢量和/或输入数组。
快速检查以确认它是有效的probability mass function (pmf)。
M = 500;
sum(geopmfh(p,[1:M])) % should return 1 if M large enough
方法2:功能(带错误检查)
顺便说一句,如果您想在函数输入上添加错误检查以确保 k 是正整数且 p ,则在MATLAB中创建函数非常有意义。在[0 1]之间。
function [pmf] = geopmf(p,k)
%GEOPMF Calculates pmf for Geometric(p,k) distribution on {1,2,3,...}
% pmf = geopmf(p,k)
% p = n x d matrix of n d-dimensional success probabilities; must be [0,1]
% k = m x d matrix of m d-dimensional numbers of trials
% pmf = n x m matrix of probabilities
%
% Examples:
% k = 4; p = .5;
% pmf = geopmf(p,k) % pmf = 0.0625
% Input Error Checking ****************************************************
if isempty(p) | isempty(k), pmf = []; return, end
if nargin ~= 2, error('Function requires two inputs.'), end
if p < 0 | p > 1, error('p must be between 0 and 1.'), end
if k < 1 | ~isint(k), error('k must be positive integer & k > 0.'), end % with this parameterization
n = size(p,1); d = size(p,2);
m = size(k,1);
if isempty(p) | ~isnumeric(p) | ~ismatrix(p)
error('p must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif isempty(k) | ~isnumeric(k) | ~ismatrix(k)
error('k must be non-empty numeric scalar, vector, or 2-D matrix.');
elseif size(k,2) ~=d
error('Rows of p and k must have same dimensions.');
end
% End (Input Error Checking) **********************************************
pmf = p.*((1-p).^(k-1));
end
方法3:MATLAB的内置函数
如果您有统计工具箱,MATLAB为此提供了一个名为geopdf
的函数,但请注意,它是根据支持“ {0,1,2,...}”的其他“版本”进行参数化的(请参阅{{3 }})。
p.*((1-p).^k) % The other parameterization
geopdf(k,p) % Note order of inputs
您可以通过调整输入来进行更正。
geopdf(k-1,p) % Subtract 1 trial
代码已通过MATLAB R2018b测试。