我想用matlab在矩陣中間繪制一個二維高斯。現在我正在做
for i = 1:size2
for j = 1:size2
gauss(i,j)=A*exp(-1/(sigma^2)*((i-round(size2/2))^2 (j-round(size2/2))^2)); %gaussiana
end
end
但它可能非常緩慢。
在matlab中我沒有找到任何功能,最快的方法是什么?mex 檔案是一個有價值的選擇嗎?
uj5u.com熱心網友回復:
使用網格網格對高斯計算進行矢量化相對簡單。
維基百科中甚至有一個 Octave 實作。
實作是:
[X, Y] = meshgrid(1:size2, 1:size2);
G = A*exp(-1/(sigma^2)*((Y-size2/2).^2 (X-size2/2).^2));
注意:我替換了round(size2/2)
,size2/2
因為四舍五入不是公式的一部分。
將一維高斯轉換為二維高斯的技巧:
為了使計算更快一點,我們可以創建一維高斯,并從中計算出二維高斯:
x = 1:size2;
G1 = sqrt(A)*exp(-1/(sigma^2)*(x-size2/2).^2); % Create 1D gaussian
G2 = G1'*G1; % Compute the 2D gaussian out of 1D gaussian.
測驗:
size2 = 101;
A = 10;
sigma = 50;
gauss = zeros(size2);
for y = 1:size2
for x = 1:size2
gauss(y,x)=A*exp(-1/(sigma^2)*((y-size2/2)^2 (x-size2/2)^2)); %gaussiana
end
end
[X, Y] = meshgrid(1:size2, 1:size2);
G = A*exp(-1/(sigma^2)*((Y-size2/2).^2 (X-size2/2).^2));
disp(['sum abs diff (G, gauss) = ' num2str(sum(abs(G(:) - gauss(:))))])
x = 1:size2;
G1 = sqrt(A)*exp(-1/(sigma^2)*(x-size2/2).^2);
G2 = G1'*G1;
disp(['sum abs diff (G1, G2) = ' num2str(sum(abs(G2(:) - G(:))))])
輸出:
sum abs diff (G, gauss) = 0
sum abs diff (G1, G2) = 7.1436e-12
更新:
根據 Cris 的評論,“不再需要網格網格”。
由于 MATLAB r2016b 我們可以使用以下代碼:
X = 1:size2;
Y = X';
G = A*exp(-1/(sigma^2)*((Y-size2/2).^2 (X-size2/2).^2));
該實作依賴于名為“隱式單例擴展”或隱式擴展的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458980.html
上一篇:如何更改MATLAB的默認格式?