怎么了?
p*q^x-1 % Your original code
您的原始代码是q
,将其提高x
th 次方,将其乘以p
,然后减去 1。这等效于您当然不打算使用的以下代码。
(p*(q^x)) - 1 % What your code was doing written differently
考虑到运算顺序,修正很容易。
p*q^(x-1) % Your corrected code
另一个可能的错误来源是您的函数没有保存为独立的 m 文件“Geometric.m”,它也必须在您的 MATLAB 路径上(MATLAB 必须“看到”它)。如果您将函数文件“ MyFunction.m ”存储在一个文件夹中,您可以将该文件夹添加到 MATLAB 的可见路径中,只需一行(或手动导航到那里)。有关更多详细信息,请参阅如何创建函数。
mypathtoMyFunction = 'C:\Users\SonnyJordan\Documents\SweetCode\FunctionFolder';
path(path,'mypathtoMyFunction')
完整解决方案(3 种方法)
从几何分布的参数化中,您需要对 {1, 2, 3, 4, ...} 的支持。
两件事情。(1)我会为这样的事情推荐一个匿名函数。(2)实际上没有必要将p和q作为单独的变量分开,因为p + q = 1,因此一个决定另一个(即q = 1-p
)。
方法一:匿名函数
% 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
上面的代码是完全向量化的,因此您可以将其传递给向量和/或输入数组。
快速检查以验证它是有效的概率质量函数 (pmf)。
M = 500;
sum(geopmfh(p,[1:M])) % should return 1 if M large enough
方法 2:函数(带错误检查)
顺便说一句,如果您想在函数输入上添加错误检查以确保k是正整数并且p在 [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,...} 的另一个“版本”参数化的(参见维基页面)。
p.*((1-p).^k) % The other parameterization
geopdf(k,p) % Note order of inputs
您可以通过调整输入来纠正这一点。
geopdf(k-1,p) % Subtract 1 trial
使用 MATLAB R2018b 测试的代码。