从C / C ++中的**矩阵中提取行/列

时间:2015-04-01 07:25:14

标签: c++ c pointers matrix

我有一个方阵double **A

我知道如何遍历这个矩阵:

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)但是,我对**

感到困惑

4 个答案:

答案 0 :(得分:2)

二维双精度数组(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所做的那样)是不可能的,因为列中的值不是连续的,只有每行中的值是连续的。

答案 1 :(得分: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];

答案 2 :(得分: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

所以你可以考虑将 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"

你不会想到程序员。

我希望这能解决一些问题!

答案 3 :(得分: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]);
    }
}

但你无法获得变量列。