2015-04-01 162 views
-1

我有一個方陣double **A提取行/從C **矩陣列/ C++

我知道如何通過這個矩陣迭代:

for (int i = 0; i < MATRIX_SIZE; i++) { 
for (int j = 0; j < MATRIX_SIZE; j ++) { 
    int val = A[i][j]; 
    printf("val: %d\n", val); 
} 
} 

不過,我不知道如何我可以給整個行或列賦予一個變量,因爲我有這個**矩陣(指向廢話指針的**指針仍然有點令人困惑,我相信它指出了雙列表的列表)。

要添加更多的背景,我試圖提取行和列,以便我可以執行cuda矩陣乘法。我看到很多在線文檔中使用的一維向量表示矩陣(即double* A)不過,我越來越糊塗與**

+0

'j ,MATRIX_SIZE>' – 2015-04-01 07:27:19

+0

@MohitJain糟糕,這是一個錯字。現在解決。謝謝 – 2015-04-01 07:28:37

+1

您不能將整行或列分配給變量。 – Himanshu 2015-04-01 07:28:39

回答

1

雙數的二維數組(double **)可以看作是一維二維數組的一維數組。

double **arr; // properly initialized 
for(int rowNumber = 0; rowNumber < MATRIX_SIZE; ++rowNumber) 
{ 
    double *row = arr[rowNumber]; 
    // do something with this row 
    for(int colNumber = 0; colNumber < MATRIX_SIZE; ++colNumber) 
    { 
     double value = row[colNumber]; 
     // do something with value 
    } 
} 

在上述例子中,row是指向從初始數組值的連續的行。這樣做是因爲二維陣列通常被分配這樣的:

double **arr = new double*[ROW_COUNT]; 
for(int rowNumber = 0; rowNumber < ROW_COUNT; ++rowNumber) 
{ 
    arr[rowNumber] = new double[COL_COUNT]; 
} 

獲得的指針在矩陣的列(如我們上面row那樣)是不可能的,因爲在一列中的值是不連續的,只有每行中的值是連續的。

+0

@lonut感謝您的解釋。我想如果我想要得到它的列,我首先必須轉置矩陣 – 2015-04-01 08:23:18

+0

是的,完全基本上該程序將內存視爲位置的一維數組,並且在此模型中,您只能在一個維度上擁有一組相鄰的值/位置(因此您的案例中的行或列都是相同的,但不能同時存在) 。 – Ionut 2015-04-01 08:42:02

1

在C++中,你可以使用std::array

std::array< std::array<int, MATRIX_SIZE>, MATRIX_SIZE> A; 

std::array<int, MATRIX_SIZE> ith_row = A[i]; 
std::array<int, MATRIX_SIZE> &ith_row_ref = A[i]; 
+0

感謝您的回答。不幸的是,我受限於一個模板,它使用雙** A :( – 2015-04-01 07:32:37

1

您可以分配行很容易變成變量,但是由於內存佈局的方式,你不能分配列。

你可以想像這樣的雙指針。 第一個指針指向要給你的行的項目。 我打算讓3W的4C矩陣向您展示一個例子

理論(你應該如何看待它在你的頭上)

Your first double pointer 

    p 
    | 
    V  0 1 2 <-indexes 
0 [p1]->[1,2,3] 
1 [p2]->[0,2,3] 
2 [p3]->[1,0,3] 
3 [p4]->[1,2,0] 

對應於矩陣

1,2,3 
0,2,1 
1,0,3 
1,2,0 

所以你可以考慮取得指數(1,0)的作爲

int **p = //some place that holds the matrix; 
int *row2 = p[1]; 
int value = p[0]; 

它不像聲明二維 數組那樣直接,因爲當得到雙指針時,你不確定內存的佈局。這些數字可以像這樣存儲

p1 p3 p2 p4 
| | | | 
[123103021120...] <- //this is basically RAM or "memory" 

而且你不會像程序員那樣想法。

我希望這清除了一些東西!

1

A [i] [j]是一個int類型,但是A [i]是一個INT指針,所以如果你想要得到一個列到一個變量,你可以這樣做:

for (int i = 0; i < MATRIX_SIZE; i ++) { 
    int* val = A[i]; 
    for (int j = 0; j < MATRIX_SIZE; j ++) { 
     printf("%d\n", val[j]); 
    } 
} 

但你無法獲得一列到一個變量。