我正在尝试绘制一个频谱图 - 为了这个问题的目的,它可以被重新描述为我试图绘制一个大矩阵(约40 000x3000 double,reals)。图形输出(根据我的经验)是matlab spectrogram
函数的最大问题,当然我在设计自己的谱图脚本时遇到了同样的问题。使用surface
我有时会受到挤压,需要重新启动计算机。
我尝试过:
'LineStyle', 'None'
添加到surface
,实际上它确实有所帮助,但还不够。surface
。如果您有任何提示,我将不胜感激。我们的目标是获得具有良好分辨率的数字,仍然可以作为频谱图读取(所以请不要mesh
等。)
注意:我知道有可能按部分绘制矩阵,这当然会有所帮助。 我正在尝试寻找另一种解决方案,可能更适合功能,程序等。
更新:要复制,粘贴,更正等的代码:
data=rand(48000,2000)
surface(data,'LineStyle','None','Visible','off')
xlabel('time');
ylabel('frequency');
colorbar('eastoutside');
set(gcf, 'renderer', 'painters');
saveas(gcf,'specgram.pdf');
答案 0 :(得分:2)
通过对显示的数据进行下采样,可以实现最大的性能提升。毕竟,屏幕上没有足够的像素来显示所有数据。可以通过各种方式进行下采样。如果您不需要担心放大/缩小,那么您可以简单地修改输入数据(例如,通过块平均或通过选择每个第N个数据元素)。但是,如果你放大绘制的数据,你将看不到所有的数据。
如果您需要在仍然显示下采样数据的同时支持缩放/平移,那么一个好的起点就是Matlab文件交换中的reduce_plot function。你应该能够相对容易地使它适应你的情节类型(我认为它目前只适用于简单的线条图)。可以在the blog post that highlighted reduce_plot中找到reduce_plot(以及一般下采样)的好处的可视化文件交换“每周选择”。
reduce_plot以及许多其他Matlab性能提示在我最近的书“ Accelerating MATLAB Performance ”(CRC Press 2014)中进行了描述。
答案 1 :(得分:0)
好的,让我总结先前评论所做的实验并回答关闭此问题。
即。不要让MATLAB查看图表,但保存为矢量图形,以便在MATLAB外部查看。
set(gcf, 'renderer', 'painters');
saveas(gcf,'spectgr.pdf');
您只绘制一次数据,但仍然可以使用。
制作的文件仍然很大,与它们合作效率不高。
这不是一个好方法。
不要让MATLAB在surf
中计算3-D元素,而是使用imagesc
。
与surf
相比,效率非常高,速度令人难以置信。
您需要花费更多时间使其看起来像频谱图(例如,轴被反转)。
这对我来说是最好的解决方案,非常感谢你!结合保存为矢量图形,它可以生成相当小的文件,但仍能很好地进行缩放。
这是我一般不想做的事情,因为我需要良好的数据分辨率。我可以想象写一些类似缩放算法的东西,根据要显示的区域选择块的大小,但它似乎是过度思考。
但是,reduce_plot函数很有意思,也许它会有一个合适的位置。未来。不管怎样,谢谢!