我在MATLAB中有以下代码
x=sym('x',[1 2]);
DV=x(1)*ED+x(2);
sv=x(1)*DV;
DD=DV./sv;
p=normcdf(-DD);
其中DV和ED均为13242 x 1个向量。一直到DD都可以。当我如上所述定义p时,我会收到以下消息:
使用symfun> validateArgNames(第205行)时出错
第二个输入必须是唯一符号变量的标量或向量。
当我定义p=1./(1+exp(-DD))
时,一切正常。因此normcdf
存在问题。
有什么想法吗?
此致
答案 0 :(得分:0)
来自normcdf
x
可以是矢量,矩阵或多维数组。
即,它不能是一个符号变量。
尝试
syms y;
p=normcdf(y)
不起作用。由于DD
是一个符号变量,因此无效。为什么你还想要几千个符号值的向量?为x
的特定非符号值运行脚本不是更有效吗?
答案 1 :(得分:0)
我弄清楚如何做到这一点。我必须定义累积密度函数的等式,而不是使用命令normcdf,其中X = -DD
答案 2 :(得分:0)
normcdf
不支持符号输入。文档没有说清楚,我同意错误消息是非常无用的(您可能会contact MathWorks and file a service request about this建议他们为统计工具箱添加对符号数学的支持。)
normcdf
函数没有做任何神奇的事情。您可以使用p = 0.5*erfc(DD./sqrt(2))
代替p = normcdf(-DD)
。这也会更快。在命令中键入edit normcdf
以查看该函数的代码。有很多错误检查和特定于浮点的情况,这就是函数错误与符号输入的原因。
另一个选择是使用来自stats::normalCDF
的MuPAD within Matlab(此功能可能仅在最近的版本中受支持)。例如:
x = sym('x',[1 2]);
ED = ones(1,3);
DV = x(1)*ED+x(2);
sv = x(1)*DV;
DD = DV./sv;
DDstr = char(-DD);
p = evalin(symengine, ['f:=stats::normalCDF(0,1):map(' DDstr(9:end-2) ',x->f(x))'])
其中f
定义procedure实现符号正常CDF,均值为0且方差为1. MuPAD的map
函数也用于对此进行向量化。总而言之,这个选项可能没有必要。