2013-02-11 79 views
3

我有一個非常大的二維數組,我需要計算此數組上的矢量運算。 NTerms和NDoc都是非常大的整數。在C#中有效地從二維數組中提取矢量

var myMat = new double[NTerms, NDocs];

我需要從該矩陣中提取向量的列。目前,我正在使用for循環。

  col = 100; 
      for (int i = 0; i < NTerms; i++) 
      { 
       myVec[i] = myMat[i, col]; 
      } 

該操作非常緩慢。在Matlab中,我可以提取矢量而不需要迭代,如下所示:

myVec = myMat[:,col]; 

有什麼辦法可以在C#中執行此操作嗎?

+0

您是否有可能在創建時轉置myMat?因爲那麼你會提取行而不是列更多的緩存一致,應該更快(雖然我不知道以什麼因素)。另一種選擇是使用'Marshal.Copy'複製內存。此外,你可以嘗試與'Parallel.For'並行。 – 2013-02-11 15:50:37

+1

如果您喜歡使用Matlab,您可能有興趣從C#調用Matlab,例如,請參閱http://stackoverflow.com/questions/5901664/calling-a-matlab-function-from-c-sharp。一點搜索會給你幾個結果。 – 2013-02-11 16:57:28

回答

3

在C#中沒有這樣的結構可以讓你像Matlab一樣使用數組。使用已有的代碼,您可以使用.NET Framework 4.0中引入的Task Parallel Library加速創建矢量的過程。

Parallel.For(0, NTerms, i => myVec[i] = myMat[i, col]); 

如果你的CPU有多個核心,那麼你的性能會有所提升,否則不會有任何效果。

有關如何將任務並行庫與矩陣和數組一起使用的更多示例,請參閱MSDN文章Matrix Decomposition

但是我懷疑C#是一個很好的選擇,當涉及到一些嚴重的數學計算。

0

的一些可能的問題:

莫非的元件是爲了在C#多維數組訪問的方式。請參閱this earlier article

另一個問題可能是您正在訪問非連續內存 - 因此緩存沒有太多幫助,並且如果數組非常大,您甚至不得不從虛擬內存(磁盤)中獲取內存。

當您一次訪問整行而不是列時,速度會怎樣?如果速度明顯加快,您可以確定它是一個連續內存問題的90%...