我正在尝试在Matlab中绘制轮廓图。但是,语法似乎是正确的,但是由于矩阵可能很大,因此matlab花费了很多时间来绘制它。
请提出我该怎么办。
下面是我的代码:
s = 10000000;
eta_gamma = zeros(s/10000);
for g1= 1:10000:s
for g2 = 1:10000:s
eta_gamma(g1,g2) = floor((1000000000 - g1 - g2)/ (200000*(1 + floor(-0.001 + 20000*(0.001 + (0.1 + 0.9/ (1 + (-1000000 + 5000000* lambertw(power(exp(1), 0.2 + g1/5.E6)/5.))/1.E6))/ 100.))) + 75000*(1 + floor(-0.001 + 20000*(0.002 + (0.2 + 0.8/ (1 + (-8000000 + 4000000* lambertw(2* power(exp(1),2 + g2/4.E6)))/8.E6)) /200.)))));
end
end
figure
contour(eta_gamma)
瓶颈似乎是因为那里有两个沉重的嵌套循环。解决方案当然vectorization
是要删除这两个循环。的最佳工具之一vectorization
,bsxfun
可以在这里使用。接下来列出的最后一个矢量化实现1.323403 seconds
在我的最后碰到了,而原始的嵌套循环版本将永远占用大量内存。这是代码-
%// Input parameter
s = 10000000;
%// Define 1D arrays corresponding to each nested loop
G1 = 1:10000:s;
G2 = 1:10000:s;
%// Perform the calculations in a vectorized manner in three parts:
%// Part1: Do vectorized "1000000000 - g1 - g2"
p1 = 1000000000 - bsxfun(@plus,G1,G2.'); %//'
%// Part2: Do vectorized operations for everything involving G1 (nested loop-I)
p2 = 200000*(1 + floor(-0.001 + 20000*(0.001 + (0.1 + 0.9./ (1 + (-1000000 + ...
5000000* lambertw(power(exp(1), 0.2 + G1/5.E6)/5.))./1.E6))/ 100.)));
%// Part3: Do vectorized operations for everything involving G2 (nested loop-II)
p3 = 75000*(1 + floor(-0.001 + 20000*(0.002 + (0.2 + 0.8./(1 + (-8000000 + ...
4000000* lambertw(2* power(exp(1),2 + G2/4.E6)))/8.E6)) /200.)));
%// Finally combine all parts into a 2D array output, which would be eta_gamma
eta_gamma_vectorized = floor(p1./bsxfun(@plus,p2,p3.')); %//'
%// Plot results
figure, contour(eta_gamma_vectorized)
这是情节的结果-
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句