2010-08-08 34 views
0

我定義二維動態數組和對數組的arrays.Dimensions分配內存是彼此(256 * 256)相同:縮短的用C二維動態數組算法++期間

double **I1,**I2; 

    int M=256; 
    int N=256; 
    int i,j; 

    I1= new double *[M+1]; 
    for(i=1;i<=M;i++) 
    {I1[i]=new double [N+1];} 

    I2= new double *[M+1]; 
    for(i=1;i<=M;i++) 
    {I2[i]=new double [N+1];} 

然後,我賦值的數組元素。我必須對這些數組執行數學算法。我使用了很多for循環。而且我的代碼工作得非常緩慢。

例如,如果我從I1減去I2和asssigned陣列。減去另一個I3二維陣列中,我使用此代碼:

double **I3; 
double temp; 
//allocate I3; 
I3= new double *[M+1]; 
for(i=1;i<=M;i++) 
{I3[i]=new double [N+1];} 


//I3=I1-I2 


for(i=1;i<=M;i++){ 
    for(j=1;j<=N;j++){ 
      temp=I1[i][j]-I2[i][j]; 
      I3[i][j]=temp;} 
} 

如何可以C++的執行時間短,而無需使用用於循環? 你能否告訴我另一種方法?

問候..

回答

2

按重要性排序:

  • 交換機上的編譯器優化。
  • 爲每個矩陣分配一個數組,並使用類似M * i + j的索引。這將分配得更快,也許更重要的是比多個分配更緊湊和更少支離破碎。
  • 習慣以零開始索引,這將爲您節省一個數組元素,通常零比較可能會更快。
  • 我看到使用for循環沒有錯。
  • 如果您願意花費更多精力,您可以使用向量化的第三方線性代數庫或使用SSE *或GPU等向量化自己。
+0

+1用於分配單個陣列。所有對「新」的調用都可能是問題的根源,而不是微不足道的循環。 – strager 2010-08-08 09:03:25

1

某些體系結構對向量算法有硬件支持,因此單條指令會將雙精度數組的所有元素相加。

但是,您必須做的第一件事是加快程序的速度。你有沒有計劃你的程序來查看減速發生的位置?

例如,你似乎在for循環中做的一件事是大量的堆分配,這往往是緩慢的。您可以將所有陣列組合成一個陣列以獲得更快的速度。

你現在正在做的這個邏輯等價的:

I3 = I1 - I2; 

如果你這樣做:

I1 -= I2; 

現在I1將存儲結果。這會破壞I1的原始值,但會避免分配新的陣列數組。

此外,C++的目的是定義類來表示數據類型及其操作。所以你可以編寫一個類來表示你的動態數組存儲。或使用現有的 - 請檢查uBLAS library

1

我不明白你爲什麼說這很慢。你在這裏做256 * 256的減法。我不認爲有一種方法可以避免在這裏出現循環(即使你使用的是矩陣庫,它也可能會保持不變)。

你可能會考慮一次分配256 * 256的浮點數,而不是調用新的256次(然後使用一些索引算術,因爲你只有一個索引),但是可能更容易找到一個矩陣庫來爲你做到這一點。

+0

在我的算法中,我必須使用大量的減法,multiplaction array 我只舉一個例子。謝謝你的幫助。 – yalcin 2010-08-08 09:23:34

2

首先,在大多數情況下,我會建議不要像這樣手動管理你的記憶。我確定你已經聽說C++提供了可以應用「算法」的容器類。這些容器不易出錯(特別是在例外的情況下),操作更具表現力,優化並且通常經過良好測試,因此證明可以工作。

在你的情況下,以前已知的數組大小,可以使用std :: vector而不會損失性能(創建除外),因爲內存保證是連續的,因此可以像數組一樣使用。你也應該考慮扁平你的數組,在循環中調用一個分配例程並不是非常快 - 分配是昂貴的。當做矩陣乘法時,考慮在行 - 主要/列 - 主要對中的分配,這有助於緩存......但是我離題了。

雖然這只是一個普遍的建議 - 我不建議你使用容器重新實現這個,我只是覺得有必要提及它們。

在這個特定的情況下,既然你提到你想要「執行數學算法」,我建議你看看能夠做矩陣/矢量操作的數字庫,因爲這看起來像你是什麼後。

對於C++,有Newmat例如,和(或多或少)規範BLAS/LAPACK實現(即Netlib,AMD的ACMLATLAS)。這些允許您使用優化算法以及優化SIMD指令(例如SSE)執行常見的(不常見的)操作,如加/減矢量,乘以矩陣等等。

很顯然,在計算時無法避免對這些值進行迭代,但可以通過優化方式和標準接口來完成。