gpt4 book ai didi

c++ - 在 C++ 中编写函数来乘以矩阵

转载 作者:行者123 更新时间:2023-11-30 03:42:05 25 4
gpt4 key购买 nike

作为练习,我应该编写一个函数,在指定特定输入的情况下可以将两个矩阵相乘。练习的编写方式应该是函数的形式:

void Multiply(double **res, double **A, double **B, int ARows, int ACols, int BRows, int BCols);           

乘法结果写入res。我不确定我是否理解上面的表格。据我所知,它将两个矩阵的地址以及它们的列数和行数作为输入。但是 res 的输入应该是什么(这是矩阵相乘的结果)?它应该是具有正确尺寸的预分配矩阵的地址吗?在这种情况下,我编写了以下代码来测试函数(我还指定了矩阵 A 和 B):

double** C;
C = new double [rows];
for (int i=0; i<rows; i++)
{
C[i] = new double [cols];
}
std::cout << Multiply(&C,&A,&B,Arows,Acols,Brows,Bcols) << "\n";
}

但我不认为这是正确的。这是我的乘法代码:

void Multiply(double **res, double **A, double **B, int ARows, int     ACols, int BRows, int BCols)
{
assert(ACols=BRows);
for (int k=0; k<BCols; k++)
{
for (int j=0; j<ARows; j++)
{
for (int i=0; i<ACols; i++)
{
res[j][k] += A[j][i]*B[i][k];
}
}
}
}

乘法测试:

int main()
{
int ARows = 2;
int ACols = 3;
int BRows = 3;
int BCols = 2;
int cols = ARows;
int rows = BCols;
double** A;
A = new double* [ARows];
for (int i=0; i<ARows; i++)
{
A[i] = new double [ACols];
}
double** B;
B = new double* [BRows];
for (int i=0; i<BRows; i++)
{
B[i] = new double [BCols];
}
A[0][0]=1;
A[0][1]=2;
A[0][2]=3;
A[1][0]=4;
A[1][1]=6;
A[1][2]=10;
B[0][0]=1;
B[0][1]=2;
B[1][0]=4;
B[1][1]=6;
B[2][0]=13;
B[2][1]=9;
double** C;
C = new double* [rows];
for (int i=0; i<rows; i++)
{
C[i] = new double [cols];
}
std::cout << Multiply(C,A,B,ARows,ACols,BRows,BCols) << "\n";
}

最佳答案

执行 &C, &A, &B 将给出双指针指针存储的地址。这意味着 Multiply 将采用 double***:指向 double** 类型的指针。你可以把它作为

std::cout << Multiply(C,A,B,Arows,Acols,Brows,Bcols) << "\n";

这将传递三个 double** 类型,即 ABC

此外,您对 C 使用 new 的方式不正确。你需要使用

C = new double*[rows];

您还试图打印一个 void 函数,这不会起作用。 Multiply 不是您可以打印的东西,您需要调用它以便定义 C。然后需要手动循环输出C。我在下面写了代码。

#include <iostream>

void Multiply(double **res, double **A, double **B, int aRows, int aCols, int bRows, int bCols)
{
if (aCols != bRows)
return;

for (int i = 0; i < aRows; i++)
{
for (int j = 0; j < bCols; j++)
{
res[i][j] = 0;
for (int k = 0; k < aCols; k++)
{
res[i][j] += A[i][k]*B[k][j];
}
}
}
}

void Initialise(double **res, int rows, int cols)
{
for (int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
res[i][j] = i*j; // whatever you want.
}
}
}

int main()
{
int aRows = 10;
int aCols = 5;
int bRows = 5;
int bCols = 6;

double** A = new double*[aRows];
for (int i = 0; i < aRows; i++)
{
A[i] = new double[aCols];
}

double** B = new double*[bRows];
for (int i = 0; i < bRows; i++)
{
B[i] = new double[bCols];
}

Initialise(A, aRows, aCols);
Initialise(B, bRows, bCols);

double** C;
C = new double*[aRows];
for (int i = 0; i < aRows; i++)
{
C[i] = new double [bCols];
}

Multiply(C,A,B,aRows,aCols,bRows,bCols);

for (int i = 0; i < aRows; i++)
{
for (int j = 0; j < bCols; j++)
{
std::cout << C[i][j] << ' ';
}
std::cout << '\n';
}

return 0;
}

关于c++ - 在 C++ 中编写函数来乘以矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37001237/

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