我有几个高斯分布,我想同时从它们中提取不同的值。因为这基本上是 GMM 所做的,所以我研究了 Matlab GMM 实现(gmrnd
),我看到它对所有组件执行了一个简单的循环。
我想以更快的方式实现它,但问题是涉及到 3d 矩阵。一个简单的代码(带循环)将是
n = 10; % number of Gaussians
d = 2; % dimension of each Gaussian
mu = rand(d,n); % init some means
U = rand(d,d,n); % init some covariances with their Cholesky decomposition (Cov = U'*U)
I = repmat(triu(true(d,d)),1,1,n);
U(~I) = 0;
r = randn(d,n); % random values for drawing samples
samples = zeros(d,n);
for i = 1 : n
samples(:,i) = U(:,:,i)' * r(:,i) + mu(:,i);
end
有没有可能加快速度?我不知道如何处理 3d 协方差矩阵(不使用cellfun
,这要慢得多)。