MATLAB的图形性能

MATLAB的图形性能

问题描述:

我使用C#和VisualStudio开发WindowsForm。程序启动一个在Matlab中完成的.exe文件,在这个.exe文件完成后,它会在几个.mat文件中生成大量的数据,我必须在图表中绘制这些数据(并非全部同时)。用户选择1这个“信号”它必须绘制。MATLAB的图形性能

根据配置,每个信号可以从〜10.000到〜500.000的值,当我用这些数据绘制信号时,图表控制不会平稳响应,放大/缩小也需要很长时间。当同时绘制更多信号时,控制变得更加不稳定。另一方面,如果我绘制来自Matlab本身的信号,那么这项工作几乎可以毫不费力地完成。变焦效果非常好,您可以根据需要绘制尽可能多的信号,因为性能得以保持。

为什么Matlab和C#有这么大的性能差异?

我该怎么做才能提高C#的性能?

编辑:我使用VisualStudio提供的标准图表控件。

+0

根据Visual Studio的版本和版本,有多个图表控件“包含”。它是'System.Windows.Forms.DataVisualization.Charting.Chart'吗? – 2013-04-22 21:33:55

+0

Visual Studio 2010,是的,System.Windows.Forms.DataVisualization.Charting.Chart – Kitinz 2013-04-23 16:13:46

你没有说你正在使用什么图表控件,但它肯定不是为大数据集设计的。为你的情节使用基于OpenGL的东西。根据我的经验,我实际上非常恼火于糟糕的性能的泛平移和超过3000万个数据点,而C#+ OpenGL实现的帧速率高出10倍。 (除了其他原因外,似乎MatLab完全无法剔除远离屏幕的部分数据集 - 例如,如果您有一个单调递增的时间轴,例如,这是一个非常简单的优化,可以实现巨大的收益好处)

+0

我编辑了我的问题以包含您请求的信息。无论如何,我也通过这个评论来告诉你,我使用VS提供的标准图表控件。我也尝试过OxyPlot(这比微软的控件执行得更好,但是很痛苦)。任何OpenGL图表控件推荐?谢谢! – Kitinz 2013-04-22 16:01:34

你有更多的数据比有像素代表它。这听起来像是您的图表控件采取了蛮力方法:即使控件上每列像素有1000个数据点,也要绘制每个数据点。

无论您是否有权访问图表控件的源代码,解决方案都将是相同的:您必须减少绘图调用的次数。您需要将数据过滤为更易于管理的大小。在折线图的情况下,如果您的控件宽度为500像素,那么它不应该试图绘制超过500行。

如果您有权访问图表控件的代码,那么您可以让它在内部减少数据集。否则,您需要从外部管理数据集的抽象视图,并将视图而不是完整的数据集传递到图表控件。该视图将需要更新,因为用户更改缩放级别等等。不幸的是,根据底层图表控件是否知道自动将数据集剪裁为可见视图,平移可能有点难以实现。每当用户平移视图时,您都需要执行裁剪操作,而且还需要在每个轴的最末端包含数据点,以便滚动条保持一致。

通过首先确保原始数据集按X轴上的值进行排序,让自己更轻松。排序只需要完成一次,然后您可以在任何缩放级别相对较快地构建视图。 O(log N)搜索可以在可见范围的开始和结束处标识索引,并从那里为您的视图提取X个样本很简单。如果已知原始数据在X轴上以固定间隔进行,那么您甚至不需要O(log N)搜索;你可以直接计算可视范围的指标。

+0

一开始我认为这比寻找一个好的图库要复杂得多,但我一直在想这种方法,现在看来是一个非常可行的选择。我想我会试试看 – Kitinz 2013-04-23 16:24:48