使用matlab的mvnrnd函数错误消息?

使用matlab的mvnrnd函数错误消息?,matlab,simulation,Matlab,Simulation,我正在创建gibbs采样算法,当我使用mvnrnd函数时,会出现以下消息: ???使用==>mvnrnd时出错 西格玛必须是对称半正定矩阵。 注意:在使用mvnrnd之前,我已经使用了chol函数 nu02=chol(nu01); nu0=s*nu02; z = mvnrnd(mu0,nu0)'; 我能做些什么来解决这个问题呢?我猜你希望nu0在你把它传递给mvnrd时应该是对称的半正定的,但是由于某些原因,有一些非常小的数值问题使得它不太对称 可能还有另一个问题,但如果是这个问题,您可以强制

我正在创建gibbs采样算法,当我使用mvnrnd函数时,会出现以下消息:

???使用==>mvnrnd时出错
西格玛必须是对称半正定矩阵。

注意:在使用mvnrnd之前,我已经使用了chol函数

nu02=chol(nu01);
nu0=s*nu02;
z = mvnrnd(mu0,nu0)';

我能做些什么来解决这个问题呢?

我猜你希望
nu0
在你把它传递给
mvnrd
时应该是对称的半正定的,但是由于某些原因,有一些非常小的数值问题使得它不太对称

可能还有另一个问题,但如果是这个问题,您可以强制它与命令完全对称

nu0 = (nu0 + nu0')/2;

希望有帮助。

实现建立一个半正定的“nu01”?如果矩阵不是半正定矩阵,Cholesky将不起作用。有没有办法强制矩阵是半正定矩阵?如果不了解更多关于您的程序的信息,我们除了遵守错误消息之外,无法提供任何帮助。另外,问题不是您是否可以将nu0转换为半正定矩阵,但要创建的nu0是用正确的数学方程半定的。不是Matlab需要nu0这样,而是数学数学需要nu0那样。错误可能有两个原因:要么
nu0
不是正方形,要么它不是>0。由于
chol
生成一个上三角矩阵,因此矩阵
s
必须确保乘积
s*nu02
的所有元素都不为零。您是否尝试过检查
nu0
的值?您可能希望通过使用max(max(abs((nu0+nu0')))来检查差异是否实际上很小;如果这是一个小数字,我想应该没问题。