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

C++ 从C/C+中的**矩阵中提取行/列+;,c++,c,pointers,matrix,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); } } for(int i=0;i < /P> < P>,可以使用< /P> std::arrayA; std::数组ith_row=A[i]; std::数组&

我有一个方阵
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);
 }
}
for(int i=0;i
然而,我想知道,如果我有这个
**
矩阵,
**
指针指向指针的无意义仍然有点让人困惑。我相信它说的是一个双精度列表),我怎么能将整行或整列赋值给一个变量

为了增加一点背景,我尝试提取行和列,以便执行
cuda
矩阵乘法。我看到很多在线文档使用一维向量表示矩阵(即<代码>双*A < /代码>),但是,我在C++中混淆了<代码> **/COD> < /P> < P>,可以使用< /P>
std::arrayA;
std::数组ith_row=A[i];
std::数组&ith_row_ref=A[i];
在C++中,可以使用

std::arrayA;
std::数组ith_row=A[i];
std::数组&ith_row_ref=A[i];

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

你可以想象这样的双指针。 第一个指针指向该项以提供行。 我将制作一个3w 4c矩阵来给你们展示一个例子

理论(你应该如何在头脑中思考)

因此,您可以考虑在索引(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"
p1 p3 p2 p4
|  |  |  |

[123103021120…]您可以轻松地将行分配给变量,但由于内存的布局方式,无法分配列

你可以想象这样的双指针。 第一个指针指向该项以提供行。 我将制作一个3w 4c矩阵来给你们展示一个例子

理论(你应该如何在头脑中思考)

因此,您可以考虑在索引(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"
p1 p3 p2 p4
|  |  |  |

[123103021120…]二维双精度数组(
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
    }
}

无法获取指向矩阵中某列的指针(就像我们在上面处理
行时所做的那样),因为列中的值不是连续的,只有每行中的值是连续的。

一个二维双精度数组(
双精度**
)可以看作是一个一维数组的一维数组的双精度数组

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
    }
}

获取一个指向矩阵中某列的指针(就像我们在上面的
行中所做的那样)是不可能的,因为列中的值是不连续的,只有每行中的值是连续的。

a[i][j]是int的一种类型,而[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]);
    }
}
for(int i=0;i

但无法获取变量的列。

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]);
    }
}
for(int i=0;i

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

j
j
?在C++中,最好使用<代码> STD::数组 <代码> @ Mojjayin OOP,这是一个打印错误。现在修好。感谢您无法将整行或整列分配给变量。是否要将2d数组转换为1d?请将空间分配给一维数组,然后您可以使用oneD_数组[i*矩阵_SIZE+j]=a[i][j]
j
j
?在C++中,最好使用<代码> STD::数组 <代码> @ Mojjayin OOP,这是一个打印错误。现在修好。感谢您无法将整行或整列分配给变量。是否要将2d数组转换为1d?请将空间分配给一维数组,然后您可以使用oneD_数组[i*矩阵_大小+j]=a[i][j]谢谢您的回答。不幸的是,我被限制在使用双**a的模板上:(谢谢你的回答。不幸的是,我被限制在使用双**a的模板上:(@lonut谢谢你的解释。我想如果我想为列获取它,我必须首先转置矩阵。是的,没错。基本上,程序将内存视为一个一维位置数组,在这个模型中,你只能在单个维度上拥有一组相邻的值/位置(因此,在您的案例中可以是行或列,但不能同时是行和列)@lonut谢谢你的解释。我想如果我想为列获取它,我必须首先转置矩阵。是的,没错。基本上,程序将内存视为一个一维位置数组,在这个模型中,在单个维度上只能有一组相邻的值/位置(因此,在您的案例中,可以选择行或列,但不能同时选择行和列)。