【问题标题】:Extract rows/columns from ** matrices in C/C++从 C/C++ 中的 ** 矩阵中提取行/列
【发布时间】:2015-04-01 07:25:14
【问题描述】:

我有一个方阵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)但是,我对** 感到困惑

【问题讨论】:

  • j &lt; i;j &lt; MATRIX_SIZE?在 C++ 中更好地使用 std::array&lt; std::array&lt;int, MATRIX_SIZE&gt;, MATRIX_SIZE&gt;
  • @MohitJain 哎呀,这是一个错字。现在修复。谢谢
  • 您不能将整行或整列分配给变量。
  • 你想把二维数组转换成一维数组吗?
  • 为一维数组分配空间,然后可以使用 oneD_Array[i*MATRIX_SIZE+j]=A[i][j]

标签: c++ c pointers matrix


【解决方案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 所做的那样)是不可能的,因为列中的值不连续,只有每行中的值是连续的。

【讨论】:

  • @lonut 感谢您的解释。我想如果我想为列获取它,我首先必须转置矩阵。
  • 是的,完全正确。基本上,该程序将内存视为一维位置数组,在此模型中,您只能在一个维度上拥有一组相邻的值/位置(因此在您的情况下是行或列,但不能同时)。
【解决方案2】:

在 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];

【讨论】:

  • 感谢您的回答。不幸的是,我受限于使用 double** A :(
【解决方案3】:

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]);
    }
}

但您无法将列添加到变量中。

【讨论】:

    【解决方案4】:

    您可以轻松地将行分配给变量,但由于内存的布局方式,您不能分配列。

    你可以想象这样的双指针。 第一个指针指向为您提供行的项目。 我要做一个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) 处的 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"
    

    作为程序员,你根本不知道。

    我希望这可以解决一些问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2014-12-29
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多