我有幾個高斯分佈,我想同時從它們中繪製不同的值。由於這基本上是GMM所做的,所以我研究了Matlab GMM實現(gmrnd
),並且我已經看到它對所有組件執行簡單的循環。Matlab中的低通高斯混合模型
我想以更快的方式實現它,但問題是涉及到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
,這比較慢)。
謝謝!不過,總和必須沿着第一個維度來完成。加快速度顯着提高'n'(在我的計算機內存耗盡之前可高達10倍),但如果我還增加'd',則反過來也是如此。如何在循環和'bsxfun'之間進行選擇似乎取決於情況,我不認爲有一個通用規則。儘管如此,再次感謝!我認爲除了你的建議之外,還有其他方法可以殺死這個循環。 – Simon