我有一个方阵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
)但是,我对**
答案 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]);
}
}
但你无法获得变量列。