我正在尝试使用C ++中的指针进行矩阵乘法,但对于大输入,程序停止执行。没有任何错误。如果有人知道解决方法,请告诉我。
以下是代码:
#include <iostream>
using namespace std;
int main() {
int r1,c1,r2,c2;//variables
cin>>r1;
cin>>c1;
cin>>r2;
cin>>c2;
int **a, **b,**c;
int sum=0;
if (c1 == r2){
a = new int *[c1]; //1st array
b = new int *[c2]; //2nd array
for (int i =0; i<=c1 ; i++ ){
a[i] = new int [r1];
} //constructing array
for (int i =0; i<=c2 ; i++ ){
b[i] = new int [r2];
}//constructing array
//input for 1st matrix
for(int j=0; j<r1; j++){
for(int k=0; k<c1; k++){
cin>>a[j][k];
}
}
//input for 1st matrix
for(int j=0; j<r2; j++){
for(int k=0; k<c2; k++){
cin>>b[j][k];
}
}
cout<<endl;
//matrix multiplication
for(int i=0;i<r1;i++){
for(int j=0;j<c2;j++){
sum =0;
for(int k=0; k<r1;k++){
sum+= a[i][k]*b[k][j]; //matrix multiplication
}
cout<<sum<<" ";
}
cout<<endl;
}
}
else{
cout<<"Please enter feaseble values";
}
// prints !!!Hello World!!!
return 0;
}
INPUT:
> 4 5
> 5 2
> 1 2 3 4 5
> 6 7 8 9 10
> -10 -9 -8 -7 -6
> -5 -4 -3 -2 -1
> 1 2
> 3 4
> 5 5
> 4 3 //the code stops here and doesn't take any further inputs
> 2 1
答案 0 :(得分:2)
您正在向后定义数组。在创建动态二维数组时,可以使用
的形式执行此操作int** ary = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
ary[i] = new int[colCount];
你在做什么
int** ary = new int*[colCount];
for(int i = 0; i < colCount; ++i)
ary[i] = new int[rowCount];
我建议您使用2d std::vector
并让向量处理所有分配。创建一个你可以做的二维矢量
std::vector<std::vector<int>> matrixA(rowCount, std::vector<int>(colCount));
答案 1 :(得分:1)
根据初始化矩阵的方式,你在处理行和列方面不一致,你应该有:
a[col][row]
但是,您将在以后的cin中对待它们:
a[row][col]
所以只要下定决心哪个应该是第一个维度,哪个应该是第二个维度并相应地修复,你应该没问题。
答案 2 :(得分:1)
在为r
和c
分配内存时,您错误地交换了a
和b
的值。
正确的代码段应为
a = new int *[r1]; //1st array
b = new int *[r2]; //2nd array
for (int i =0; i<=r1 ; i++ ){
a[i] = new int [c1];
} //constructing array
for (int i =0; i<=r2 ; i++ ){
b[i] = new int [c2];
}//constructing array
答案 3 :(得分:1)
您正在访问超出其大小的数组,因为某些for循环中的退出条件为<=
,但它应为<
:
a = new int *[c1]; //1st array
b = new int *[c2]; //2nd array
for (int i =0; i<=c1 ; i++ ){ // Here you should have i<c1
a[i] = new int [r1];
} //constructing array
for (int i =0; i<=c2 ; i++ ){ // Here you should have i<c2
b[i] = new int [r2];
}//constructing array
此外,当您创建矩阵时,您遵循错误的顺序。您应首先创建行,然后创建列。你正在反过来这样做,这导致指数消失。尝试交换行和列,如下所示:
a = new int *[r1]; //1st array
b = new int *[r2]; //2nd array
for (int i =0; i<r1 ; i++ ){
a[i] = new int [c1];
} //constructing array
for (int i =0; i<r2 ; i++ ){
b[i] = new int [c2];
}//constructing array
我可以编译它,我得到结果
38 37
103 107
-105 -117
-40 -47
出于好奇,我检查了这个结果,这是错误的。正确的应该是:
48 42
123 117
-117 -123
-42 -48
错误在于,当您将使用r1
个元素的元素相乘时,它们实际上是c1
。因此,要修复错误,您必须更改使用k的for循环的退出条件,从for(int k=0; k<r1;k++){
到for(int k=0; k<c1;k++){