2015-04-01 130 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]); 
    } 
} 

但你无法获得一列到一个变量。