mathematica里面有个函数 ListDensityPlot 想问问matlab中有相同功能的函数么

已知矩阵,通过mathematics的ListDensityPlot可以得到二维密度分布图,但是较大的矩阵mathematics算不过来,想知道matlab里面是否有相同... 已知矩阵,通过mathematics的ListDensityPlot可以得到二维密度分布图,但是较大的矩阵mathematics算不过来,想知道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]

输出的结果为:
展开
 我来答
xzcyr
2015-01-03 · TA获得超过3399个赞
知道大有可为答主
回答量:1400
采纳率:100%
帮助的人:669万
展开全部

虽然答这个题就是自降采纳率但是我还是要来说明一下。


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的程序确实写的很渣。。😓😓你写的这段程序我试了试,比我的快多了。。谢谢呀😁😁👍👊
追答
不谢不谢~虽然你现在也不可能改采纳我的答案了但是如果你能给我点下赞抚慰下我的心灵的话我会很开心的~
tianxiawulang
推荐于2016-07-19 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2646万
展开全部

不知道这种密度图是按照什么规律做的,我试着把数据取对数(不然数据量级相差太大,除了四个角之外,其它部分基本上无法分辨),然后用伪彩图表现,结果如下:

和你的效果差别还不小,但应该大致能看出点意思了。

 

参考代码:

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
更多追问追答
追问

Plot3D[Sin[1/(x*y)], 原函数三维

 

DensityPlot[Sin[1/(x*y)]] 密度图

data = Table[{Sin[1/(x*y)]};ArrayPlot[Log[1 + data]] 取对数

图2和图3强度还是不一样的,我认为不是取对数,mathematic的密度图应该是将原函数的Z值以亮度表示出来了,但我不知道具体的算法是什么~

追答

我取对数只是就具体的问题采取的一种处理手段,并不意味着我认为那是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

下面是绘图的效果:

为了和你的结果比较接近,我自己做了一个调色板,换用这个调色板之后,你最初问题的伪彩图如下:

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式