gpt4 book ai didi

c - 指针,内存分配 : index of rows in Matrix Multiplication (C Programming)

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:56 27 4
gpt4 key购买 nike

我无法理解问题中的“a 的行索引”指的是什么……您能举个例子吗?为什么

sum = sum + a[(row * a_cols) + k] * b[k * b_cols + col]?

谢谢!

double dotProduct(double a[], const unsigned a_rows, const unsigned a_cols,
/* a is a matrix with a_rows rows and a_cols columns */
double b[], const unsigned b_cols,
/* b is also a matrix. It has a_cols rows and b_cols columns */
unsigned row, // an **index of a row of a**
unsigned col) // an index of a column of b
{
int k; // loop variable

double sum = 0.0; // the result of the dot product is stored here
k = 0;
while (k < a_cols) { // recall: a_cols == b_rows
/* we need to multiply a[row, k] and b[k, col] and add that to sum */
sum = sum + a[(row * a_cols) + k] * b[k * b_cols + col];
/* recall a[i,j] is stored at a[(i * a_cols) + j]
and b[i,j] is stored at b[(i * b_cols) + j] */
k += 1;
}

return sum;
}

最佳答案

编辑我的不好,忘了我的第一个答案,我误解了问题...

回答:dotProduct() 方法的第 5 个参数,名为 row,作为 a 的行索引 给出。
这意味着它是一个 0 到 (a__rows -1) 的值,用于指定“矩阵”a 的一个特定行。 (实际上它可能是 1 到 a__rows 的值。这只是一个约定问题;数学人员倾向于喜欢“基于 1”的索引,程序员更喜欢基于 0 的值。请参阅 Adam Liss 对此主题的有趣评论在备注中)
由于矩阵 a 是在一维数组中实现的,因此您需要使用简单的算术来寻址 a 中由 row 索引的行上的所有单元格。

“公式”是按顺序访问所有这些单元格是

for (int c = 0; c < a_cols; c++)
{
A_Cell_Value = a[row * a_cols + c];
}

将应用类似的公式来扫描 b 的给定 的单元格。然而在这种情况下,索引 col 将用作偏移量,而 b_cols 将用作因子。具体来说,

// not an error this is a_cols which also corresponds to the number of rows of
// matrix b, so that these matrices would be compatible for multiplication
for (int r = 0; r < a_cols; r++)
{
B_Cell_Value = b[(r * b_cols) + col];
}

我认为以上内容为您提供了遍历行或列单元格的必要理解。我让您将所有这些放在您的应用程序中。

一些提示: - 做一些参数值检查。这将避免在这些矩阵上出现越界错误。 - 在您的程序中引入抽象的一个好方法是引入一个函数,该函数从矩阵维度和两个行和列索引返回矩阵的单个单元格的值。例如:

// returns the matrix's cell value at RowIdx and colIdx
double GetCell(double matrix[], int nbOfRow, int nbOfColumns,
int rowIdx, int colIdx)
{
if (rowIdx < 0 || rowIdx >= nbOfRows ||
colIdx <0 || colIdx >= nbOfColumns
)
{
printf("bad arguments in GetCell()\n");
return 0; // print
}
return matrix[rowIdx * nbOfColumns + colIdx];
}

以这种方式,您将抽象化(=隐藏相关细节)这些线性存储的丑陋矩阵,并能够在点积公式级别根据行和列索引来解决它们。
换句话说,GetCell() 函数担心根据其对矩阵实现结构的了解找到正确的单元格。它不必知道此单元格值将用于什么。 DotProduct 计算逻辑担心 A 的哪个系列的单元格与 B 的哪个系列的单元格相乘,根据它们的行/列(i/j 等)“协调”“自然地”解决这些单元格中的每一个,它不会' 需要知道数据是如何有效地存储在矩阵实现中的。

关于c - 指针,内存分配 : index of rows in Matrix Multiplication (C Programming),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563855/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com