2013-04-22 31 views
1

我使用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

回答

0

你沒有說你正在使用什麼圖表控件,但它肯定不是爲大數據集設計的。爲你的情節使用基於OpenGL的東西。根據我的經驗,我實際上非常惱火於糟糕的性能的泛平移和超過3000萬個數據點,而C#+ OpenGL實現的幀速率高出10倍。 (除了其他原因外,似乎MatLab完全無法剔除遠離屏幕的部分數據集 - 例如,如果您有一個單調遞增的時間軸,例如,這是一個非常簡單的優化,可以實現巨大的收益好處)

+0

我編輯了我的問題以包含您請求的信息。無論如何,我也通過這個評論來告訴你,我使用VS提供的標準圖表控件。我也嘗試過OxyPlot(這比微軟的控件執行得更好,但是很痛苦)。任何OpenGL圖表控件推薦?謝謝! – Kitinz 2013-04-22 16:01:34

0

你有更多的數據比有像素代表它。這聽起來像是您的圖表控件採取了蠻力方法:即使控件上每列像素有1000個數據點,也要繪製每個數據點。

無論您是否有權訪問圖表控件的源代碼,解決方案都將是相同的:您必須減少繪圖調用的次數。您需要將數據過濾爲更易於管理的大小。在折線圖的情況下,如果您的控件寬度爲500像素,那麼它不應該試圖繪製超過500行。

如果您有權訪問圖表控件的代碼,那麼您可以讓它在內部減少數據集。否則,您需要從外部管理數據集的抽象視圖,並將視圖而不是完整的數據集傳遞到圖表控件。該視圖將需要更新,因爲用戶更改縮放級別等等。不幸的是,根據底層圖表控件是否知道自動將數據集剪裁爲可見視圖,平移可能有點難以實現。每當用戶平移視圖時,您都需要執行裁剪操作,而且還需要在每個軸的最末端包含數據點,以便滾動條保持一致。

通過首先確保原始數據集按X軸上的值進行排序,讓自己更輕鬆。排序只需要完成一次,然後您可以在任何縮放級別相對較快地構建視圖。 O(log N)搜索可以在可見範圍的開始和結束處標識索引,並從那裏爲您的視圖提取X個樣本很簡單。如果已知原始數據在X軸上以固定間隔進行,那麼您甚至不需要O(log N)搜索;你可以直接計算可視範圍的指標。

+0

一開始我認爲這比尋找一個好的圖庫要複雜得多,但我一直在想這種方法,現在看來是一個非常可行的選擇。我想我會試試看 – Kitinz 2013-04-23 16:24:48