#include <stdio.h>
#include <stdlib.h>
double matrixMultiply(double a[100][100],double b[100][100], int rowA,int colB,int colArowB){
double c[100][100];
int i,j,k;
for(i=0;i<rowA;i++)
for(j=0;j<colB;j++){
for(k=0;k<colArowB;k++)
c[i][j]=c[i][j]+a[i][k]+b[k][j];}
return c;
}
int main()
{
double a[100][100],b[100][100];
int n,m,o,p,i,j;
printf("%s \n", "Nr. linii A:");
scanf("%d",&n);
printf("%s \n", "Nr. coloane A:");
scanf("%d",&m);
printf("%s \n", "Nr. linii B:");
scanf("%d",&o);
printf("%s \n", "Nr. coloane B:");
scanf("%d",&p);
printf("%s \n", "A=");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d", &a[i][j]);
printf("%s \n", "B=");
for(i=0;i<o;i++)
for(j=0;j<p;j++)
scanf("%d", &b[i][j]);
if(m==o){
printf("Matricile se pot inmulti");
cout<<matrixMultiply(a,b,n,m,p);
return 0;}
else printf("Matricile nu se pot inmulti");
return 0;
}
我应该乘以2个矩阵A&amp; B,但我不知道如何返回矩阵C,有人可以帮忙吗? 返回矩阵C时出错,我还需要打印矩阵C吗?
答案 0 :(得分:2)
我应该乘以2个矩阵A&amp; B,但我不知道如何返回矩阵C,有人可以帮忙吗?
return c;
由于数组衰减为指针,将无法工作。不仅如此,一旦函数返回,指针就会变为无效,因为c
是一个函数局部变量。
如果在编译时已知矩阵的大小,则可以使用std::array
。如果仅在运行时知道矩阵的大小,则应使用std::vector
的{{3}}。
std::array<std::array<int, 100>, 100> matrixMultiply(...) {}
或
std::vector<std::vector<int>> matrixMultiply(...) {}
答案 1 :(得分:-1)
正如其他人所说,您可以使用std::vector<std::vector<int>>
,但如果您仍想使用2D数组,则需要使用malloc在函数中动态分配2D数组并返回double* matrixMultiply(double a[100][100],double b[100][100], int rowA,int colB,int colArowB)
或你也可以在main函数中分配并只传递地址引用cout<<matrixMultiply(&a,&b,n,m,p);
答案 2 :(得分:-1)
首先请注意,由于数组衰减机制
,函数无法返回内置的2d数组并且我建议您不要使用std::vector
,因为它会非常慢并且没有 RVO,返回值优化,复制矢量会花费您太多时间。
所以我希望你使用动态内存并返回数组名称或引用。
答案 3 :(得分:-2)
vector
可能是更好的选择。
该功能可能如下所示,此问题的整个程序为here
using namespace std;
typedef vector<double> MatrixRow;
typedef vector<MatrixRow> Matrix;
Matrix matrix_multiply(const Matrix &left, const Matrix &right)
{
// Validate conditions of multiplication of matrices
if (left.empty())
{
cerr << "Left matrix is empty." << endl;
exit(-1);
}
if (right.empty())
{
cerr << "Right matrix is empty." << endl;
exit(-1);
}
const int leftRowCount = left.size();
const int leftColumnCount = left.front().size();
const int rightRowCount = right.size();
const int rightColumnCount = right.front().size();
if (leftColumnCount != rightRowCount)
{
cerr << "The number of columns of the left matrix is not the same as the number of columns of the right matrix." << endl;
exit(-1);
}
cout << "Calculate steps" << endl
<< "=====" << endl;
// Calculation
Matrix matrix(leftRowCount);
for (int i = 0; i < leftRowCount; i++)
{
matrix.at(i).resize(rightColumnCount);
for (int j = 0; j < rightColumnCount; j++)
{
matrix.at(i).at(j) = 0;
cout << "M(" << i << "," << j << ") = ";
for (int k = 0; k < leftColumnCount; k++)
{
cout << "L(" << i << "," << k << ") + R(" << k << "," << j << ")";
if (k < leftColumnCount - 1)
{
cout << " + ";
}
matrix.at(i).at(j) += left.at(i).at(k) * right.at(k).at(j);
}
cout << endl;
}
}
cout << endl;
return matrix;
}
有关标识符命名的更多信息:
在声明中
标识符可用于命名对象,引用, 函数,枚举器,类型,类成员,命名空间,模板, 模板特化,参数包,转到标签等 实体,但有以下例外:
- 作为关键字的标识符不能用于其他目的;
- 保留带有双下划线的标识符;在
- 以下划线开头,后跟大写字母的标识符 信保留;
- 以下划线开头的标识符 在全局命名空间中保留。
有关C ++中标识符命名的更多信息,请访问here了解详细信息。