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谢谢你的解释。我想如果我想为列获取它,我必须首先转置矩阵。是的,没错。基本上,程序将内存视为一个一维位置数组,在这个模型中,在单个维度上只能有一组相邻的值/位置(因此,在您的案例中,可以选择行或列,但不能同时选择行和列)。