Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何构造一个以几何分布给出概率的函数?_Matlab_Function_Probability_Probability Distribution - Fatal编程技术网

Matlab 如何构造一个以几何分布给出概率的函数?

Matlab 如何构造一个以几何分布给出概率的函数?,matlab,function,probability,probability-distribution,Matlab,Function,Probability,Probability Distribution,我用MATLAB做了一个函数,当我输入p,q和尝试次数(x)作为输入时,返回几何分布的概率质量函数(PMF) 我的职能: 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” 我尝试过改变函数

我用MATLAB做了一个函数,当我输入p,q和尝试次数(x)作为输入时,返回几何分布的概率质量函数(PMF)

我的职能:

function Probability = Geometric(p, q, x)
Probability = p*q^x-1
现在每当我试图通过键入pqx的值来计算概率时,例如:

Geometric(0.5, 0.5, 1),
确切的错误是:

几何(0.5,0.5,1)

???类型为“double”的输入参数的未定义函数或方法“Geometric”

我尝试过改变函数,并将它们简化为一个输入和一个输出


我希望能计算出概率,但事实并非如此。

出了什么问题?

p*q^x-1       % Your original code
您的原始代码取
q
,将其提升为
x
的第次方,乘以
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的可见路径中(或手动导航到该路径)。有关更多详细信息,请参阅

完整的解决方案(3种方法)
通过对的参数化,您需要对{1,2,3,4,…}的支持

两件事(1)我推荐一种适合这样的产品(2)实际上不需要将p和q作为单独的变量分开,因为p+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
上面的代码是完整的,所以您可以将向量和/或输入数组传递给它

快速检查以验证它是否有效

方法2:功能(带错误检查)
另一方面,如果您想在函数输入上添加错误检查,以确保k是正整数且p在[0-1]之间,则在MATLAB中生成函数将非常有意义

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
您可以通过调整输入来纠正这一点

geopdf(k-1,p)          % Subtract 1 trial

代码测试与MATLAB R2018b

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
p.*((1-p).^k)          % The other parameterization
geopdf(k,p)            % Note order of inputs
geopdf(k-1,p)          % Subtract 1 trial