2012-07-15 24 views
2

在GSL中,一個實數n * m矩陣M在內部表示爲大小爲n*m的數組。要訪問M的(i,j)元素,內部GSL必須訪問數組的位置,其中涉及整數乘法和加法。GSL vs數值食譜。處理矩陣的最佳方法

在C的Numerical Recipes中,他們推薦了另一種方法來聲明n指針數組,每個指針指向一個數組m。然後訪問(i,j)元素,一個放入M[i-1][j-1]。他們聲稱這更有效,因爲它避免了整數倍增。缺點是必須分別初始化每個指針。

我想知道,每種方法的優缺點是什麼?

+0

請注意,習慣於0索引。這是最好的。 0是第一個元素。 – 2012-07-15 04:21:18

+1

@JoshPetitt NR書使用1索引。以便代碼與Fortran版本相同。在Fortran中編寫了大量的數字代碼。 – 2012-07-15 05:38:53

+1

@馬丁,你是對的。 Fortran中編寫了許多數字代碼。 Fortran具有列主要的順序,並且通常Fortran對2D矩陣計算更快。 C不是Fortran。這個問題是用C標記的。在寫C時,我會使用C約定。尤其是如果我關心的是儘可能快地用C來做事情。 – 2012-07-15 16:45:43

回答

2

在C:

#define n 2 
#define m 3 

int M[n*m]; 

在C矩陣相同

int M[n][m]; 

被說成是存儲在行優先順序

http://en.wikipedia.org/wiki/Row-major_order

在C中,

M[1][2] 

相同

*(M + 1*m + 2) // if M is define as M[n][m] 

您可以定義中號正指針數組,但你還是必須把數據的地方,最好的地方可能是一個二維數組。我會建議:

int M[n][m]; 

int* Mrows[n] = {M[0], M[1]}; 

然後,你可以做一個直接偏移到行到達你想要的行。然後:

Mrows[1][2] 

是一樣的程序員

*((*(Mrows + 1)) + 2) 

它更多的工作,大概只有值得的,如果你想要去的真快。在這種情況下,您可能希望查看更多優化,例如特定的機器指令。此外,根據您的算法,您可能只能使用+操作(如果您正在遍歷矩陣)