中易网

C++二维数组改为一维数组使用的问题

答案:1  悬赏:70  
解决时间 2021-02-21 11:33
//【例5.5】矩阵运算:矩阵转置与矩阵相乘。
#include <iostream>
#include <iomanip>
using namespace std;

void inverse(int [3][6], int [6][3]);
void multi(int [6][3], int [3][4], int [6][4]);
void output(int [6][4]);

int main(){
int middle[6][3], result[6][4];
int matrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6};
int matrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4};
inverse(matrix1,middle);
multi(middle,matrix2,result);
output(result);
return 0;
}

void inverse(int matrix1[3][6],int middle[6][3]){
int i,j;
for (i=0;i<3;i++)
for (j=0;j<6;j++)
middle[j][i]=matrix1[i][j];
return;
}
void multi(int middle[6][3],int matrix2[3][4],int result[6][4]){
int i,j,k;
for (i=0;i<6;i++){
for (j=0;j<4;j++){
result[i][j] = 0;
for (k=0;k<3;k++)
result[i][j]+=middle[i][k]*matrix2[k][j];
}
}
return;
}
void output(int result[6][4]){
int i,j;
cout <<"result"<<'\n';
for (i=0;i<6;i++){
for (j=0;j<4;j++)
cout <<setw(6)<<result[i][j];
cout<<'\n';
}
return;
}

要求:将此例题改为用一维数组,附加行、列参数,实现通用算法。

求解。。
最佳答案
#include <iostream>
#include <iomanip>
using namespace std;
void inverse(int [3][6], int [6][3]);
void multi(int [6][3], int [3][4], int [6][4]);
void output(int [6][4]);
int main(){
    int middle[6][3], result[6][4];
    int matrix1[3][6]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6};   
    int matrix2[3][4]={3,2,1,0,-1,-2,9,8,7,6,5,4};
inverse(matrix1,middle);
  multi(middle,matrix2,result);
    output(result);
    system("pause");
return 0;
}
void inverse(int matrix1[3][6],int middle[6][3]){            
    int i,j;
    for (i=0;i<3;i++)
      for (j=0;j<6;j++)
        middle[j][i]=matrix1[i][j];                           
    return;                                                      
}
void multi(int middle[6][3],int matrix2[3][4],int result[6][4]){                                                                    
    int i,j,k;
    for (i=0;i<6;i++){
      for (j=0;j<4;j++){
        result[i][j] = 0;
        for (k=0;k<3;k++)
          result[i][j]+=middle[i][k]*matrix2[k][j];
      }
    }
    return;
}
void output(int result[6][4]){
    int i,j;
cout <<"result"<<'\n';
    for (i=0;i<6;i++){
      for (j=0;j<4;j++)
        cout <<setw(6)<<result[i][j];
      cout<<'\n';
    }
    return;                                                       
}




修改一下访问方式即可,修改后如下:
#include <iostream>
#include <iomanip>
using namespace std;


void inverse(int matrix1[],int m,int n,int middle[]){            
    int i,j;
    for (i=0;i<m;i++)
      for (j=0;j<n;j++)
        middle[j*m+i]=matrix1[i*n+j];                           
    return;                                                      
}

void multi(int middle[],int m1,int n,int matrix2[],int m2,int result[]){
//m1,n row col of middle;
//n,m2 row col of matrix2;
//m1,m2 row col of result                                                                     
    int i,j,k;
    for (i=0;i<m1;i++){
      for (j=0;j<m2;j++){
        result[i*m2+j] = 0;
        for (k=0;k<n;k++)
          result[i*m2+j]+=middle[i*n+k]*matrix2[k*m2+j];
      }
    }
    return;
}

void output(int result[],int m,int n){
    int i,j;
//cout <<"result"<<'\n';
    for (i=0;i<m;i++){
      for (j=0;j<n;j++){
        cout <<setw(m)<<result[i*n+j];
      }
      cout<<'\n';
    }
    return;                                                       
}

int main(){

    int matrix1[18]={8,10,12,23,1,3,5,7,9,2,4,6,34,45,56,2,4,6};  //3,6 
    int middle[18];//6,3
    int matrix2[12]={3,2,1,0,-1,-2,9,8,7,6,5,4};//3,4
    int result[24];//6,4
    cout << "matrix1:"<<endl; 
output(matrix1,3,6);

    inverse(matrix1,3,6,middle);
cout << "middle:" << endl;
    output(middle,6,3);


   multi(middle,6,3,matrix2,4,result);
    cout << "middl * matrix2:"<<endl;
    output(result,6,4);
    system("pause");
return 0;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
手机WLAN打不开,关机也打不开怎么办
梦传奇网吧地址在哪,我要去那里办事
宅男还有另种叫法是什么?
高中怎么和女生交往啊
五星级酒店床单有几条
虎门赤岗广场距离长安厦岗有多远
泰迪疫苗没打全可以带出来吗
韦亮记黄焖鸡米饭怎么去啊,有知道地址的么
传奇如何喝幸运7裁决
0.17km是多少公里?
喜洋连锁便利店NO.2325地址有知道的么?有点
逆战,4级88分支我看别人88的血比我的88血长
汽车喷水后要补充吗
三友加油站在哪里啊,我有事要去这个地方
沙鱼涌海滩开车怎么去
推荐资讯
戴尔电脑怎么用光盘重装系统
我获得了了“雏鹰奖章”,可老师让让写事迹的
天台爱情好看吗?是不是会归属烂片系列?票房
遇见真爱手绳会断吗
斗鱼两公两母放在一起会自行交配吗
高三对于请家教好不好?
丽思达洗化地址有知道的么?有点事想过去
从装有2个红球和2个白球的袋内任取两个球,那
陈曼副食地址有知道的么?有点事想过去
这俩自行车是什么牌子的
广德县四合乡中心小学地址在哪,我要去那里办
开朗的反义词是什么
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?