mathematica里面有个函数 ListDensityPlot 想问问matlab中有相同功能的函数么
mathematica程序如下:
a = 1;b = 1;num = 100;Nn = 10;kx = Table[2 Pi i/num + 0.00001, {i, 0, num}];ky = Table[2 Pi i/num + 0.00001, {i, 0, num}];
int[x_, y_] = (Sin[Nn x a/2] Sin[Nn y a/2]/Sin[x a/2]/Sin[y a/2])^2;
data = Table[int[kx[[i]], ky[[j]]], {i, 1, Length[kx]}, {j, 1, Length[ky]}];
ListDensityPlot[data]
输出的结果为: 展开
虽然答这个题就是自降采纳率但是我还是要来说明一下。
0 ListDensityPlot的默认绘图策略其实是选择变化最激烈的范围进行绘图,没有用到取对数之类的技巧。
1 如果在你的电脑上Mathematica算不过来而Matlab算得过来那只能说明你Mathematica代码写的太渣。
2 如果是要画大矩阵的密度图,也就是说,那么,别用ListDensityPlot了,它生成的是矢量图,自然慢。对大矩阵来说,光靠自身所含的点量就足以得到高质量的图形了。这种时候应用ArrayPlot。对于点数极多的列表,ArrayPlot重设ColorFunction之后和ListDensityPlot看上去没啥区别。
总之,你试试这个代码:
a = 1;
b = 1;
num = 1000;
Nn = 10;
kx = 2 Pi Range[0, num]/num + 0.00001; // AbsoluteTiming
ky = 2 Pi Range[0, num]/num + 0.00001; // AbsoluteTiming
int[x_, y_] = (Sin[Nn x a/2] Sin[Nn y a/2]/Sin[x a/2]/Sin[y a/2])^2;
data = int[kx, #] & /@ ky; // AbsoluteTiming
ArrayPlot[data, PlotRange -> {0, 10},
ColorFunction -> "AvocadoColors"] // AbsoluteTiming
在我的老电脑上1000^2个点耗时4 s不到:
嘎嘎。。我mathematics的程序确实写的很渣。。😓😓你写的这段程序我试了试,比我的快多了。。谢谢呀😁😁👍👊
不谢不谢~虽然你现在也不可能改采纳我的答案了但是如果你能给我点下赞抚慰下我的心灵的话我会很开心的~
不知道这种密度图是按照什么规律做的,我试着把数据取对数(不然数据量级相差太大,除了四个角之外,其它部分基本上无法分辨),然后用伪彩图表现,结果如下:
和你的效果差别还不小,但应该大致能看出点意思了。
参考代码:
a = 1;
b = 1;
num = 100;
Nn = 10;
[kx, ky] = meshgrid( 2*pi*(0:num)/num + 0.00001 );
data = ( sin(Nn*kx*a/2) .* sin(Nn*ky*a/2) ./ sin(kx*a/2) ./ sin(ky*a/2) ) .^ 2;
pcolor(log(data+1))
colormap(gray)
shading interp
axis square
我取对数只是就具体的问题采取的一种处理手段,并不意味着我认为那是Mathematica的做法,更并不意味着你在所有场合都要这样处理。因为你最初提问的那个函数均值只有118.6,而最大值是10000,如果直接用亮度表示函数值,除了四个角函数值比较大的部分,其它位置基本都是黑色的了。
事实上,我在取对数之前加了个常数,也是有考虑的,那个常数的大小对于图形效果也有很直接的影响。
至于你现在的函数sin(1/xy),函数值差异不显著,当然就没必要再取对数了:
[x, y] = meshgrid( linspace(0.1,0.8,200) );
data = sin(1./(x.*y));
pcolor(x,y,data)
N = 100;
colormap([linspace(0.5,1,N); linspace(0,1,N); ones(1,N)]');
shading interp
axis square
下面是绘图的效果:
为了和你的结果比较接近,我自己做了一个调色板,换用这个调色板之后,你最初问题的伪彩图如下: