當前位置:首頁 » 編程語言 » 兩個矩陣相乘c語言

兩個矩陣相乘c語言

發布時間: 2022-12-24 20:25:30

A. c語言實現矩陣乘法

1,若程序定義為三行三列的矩陣,並在主函數中鍵盤賦值。請編寫函數juzhen(int a[][3],int n),函數功能是:使矩陣左下角元素中的值乘以.例如:若矩陣中的值為:
1 9 7
2 3 8
4 5 6
n=3,則矩陣值變為:
1 9 7
6 9 8
12 15 18
註:二維數組下三角元素每行最後元素的列標和該列的列號一致

#include <stdio.h>
int juzhen(int a[][3],int n)
{
int i,j;
for (i=1;i<3;i++)
for (j=0;j<=i;j++)
a[i][j]=a[i][j]*n;
}
main()
{
int i,j,a[3][3],m;
clrscr();
printf("please enter 9 numbers :\n");
for (i=0;i<3;i++)
for (j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("the old ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("please enter a int number:\n");
scanf("%d",&m);
juzhen (a,m);
printf("the new ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
2,請編寫函數juzhen,該函數的功能是:將三行四列矩陣x乘以四行三列矩陣y,結果放在三行三列矩陣中。矩陣相乘的基本方法是:矩陣Xy中行列下標分別為i,j的元素的值,是矩陣X中第i行上四個元素與矩陣Y中第j列上四個元素對應相乘的積。
X和Y矩陣原型可運行後看到!
#include <conio.h>
#include <stdio.h>
void juzhen (int a[3][4],int b[4][3],int ab[3][3])
{
int i,j,z;
for (i=0;i<3;i++)
for (j=0;j<4;j++)
for (z=0;z<3;z++)
ab[i][z]=ab[i][z]+a[i][j]*b[j][z];/*此得為要填寫的內容*/
}
main()
{
int x[3][4]={1,0,1,1,2,1,0,1,1,2,0,3};
int y[4][3]={1,1,1,0,0,0,2,1,1,1,1,3};
int xy[3][3]={0},i,j;
clrscr();
juzhen (x,y,xy);
printf("x ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf("%3d",x[i][j]);
printf("\n");
}
printf("y ju zhen is:\n");
for (i=0;i<4;i++)
{
for (j=0;j<3;j++)
printf("%3d",y[i][j]);
printf("\n");
}
printf("xy ju zhen is:\n");
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%3d",xy[i][j]);
printf("\n");
}
}
由於你沒有說要求,我就寫了兩個,這是兩道比較精典的求c語言矩陣乘法程序

B. C語言中兩矩陣相乘

#include <stdio.h>
int main()
{
int x,y,z;
int i,j,l;
int sum=0;
printf("請輸入前一個矩陣的行數,列數與後一個矩陣的列數:\n");
scanf("%d %d %d",&x,&y,&z);
int a[x][y];
int b[y][z];
int c[x][z];
//讀入矩陣
printf("請輸入矩陣a:\n");
for(i=0;i<x;i++){
for(j=0;j<y;j++){
scanf("%d",&a[i][j]);
}
}
printf("請輸入矩陣b:\n");
for(i=0;i<y;i++){
for(j=0;j<z;j++){
scanf("%d",&b[i][j]);
}
}
printf("矩陣a為:\n");
for(i=0;i<x;i++){
for(j=0;j<y;j++){
printf("%d",a[i][j]);
if(j==y-1)
printf("\n");
else
printf("\t");
}
}
printf("矩陣b為:\n");
for(i=0;i<y;i++){
for(j=0;j<z;j++){
printf("%d",b[i][j]);
if(j==z-1)
printf("\n");
else
printf("\t");
}
}
for(i=0;i<x;i++){
for(l=0;l<z;l++){
for(j=0;j<y;j++){
sum+=a[i][j]*b[j][l];
if(j==y-1){
c[i][l]=sum,sum=0;
}
}
}
}
printf("矩陣a與矩陣b的乘積為:\n");
for(i=0;i<x;i++){
for(j=0;j<z;j++){
printf("%d",c[i][j]);
if(j==z-1)
printf("\n");
else
printf("\t");
}
}

return 0;
}

C. C語言題,求兩個矩陣的乘積

簡單題,按照矩陣的定義去做即可

源代碼如下

//#pragma GCC diagnostic error"-std=c11"

#include<stdlib.h> //有隨機數庫

#include<malloc.h>

#include<time.h> //用於產生隨機數種子

#include<math.h>

#include<string.h>

#include<stdio.h>

#define ELE int

typedef struct Metrix {

ELE *A;

int row, col;

}Metrix;

//初始化矩陣

void init(Metrix *M, int row, int col, int auto_read) {

M->A = (ELE*)calloc(row*col, sizeof(ELE));

M->row = row;

M->col = col;

if (auto_read) {

int i, size = row*col;

for (i = 0; i<size; i++)

scanf("%d", M->A + i);

}

}

#define IDX(M,r,c) (r*(M->col)+c)

ELE* get(Metrix *M, int r, int c) {

return M->A + IDX(M, r, c);

}

int main()

{

int m, l, n, i, j, k;

scanf("%d%d%d", &m, &l, &n);

Metrix L, R;

init(&L, m, l, 1);

init(&R, l, n, 1);

// init(M,m,n,0);

//矩陣乘法走起

for (i = 0; i<m; i++) {

for (j = 0; j<n; j++) {

ELE *lp = get(&L, i, 0), *rp = get(&R, 0, j);

ELE out = 0;

for (k = 0; k<l; k++) {

out += *(rp)*lp[k];

rp += n; //rp換下一行

}

printf("%d ", out);

}

printf(" "); //刪去空格再換行。

}

return 0;

}

D. C語言兩個矩陣乘積

#include<stdio.h>
int main(){
int a[100][100],b[100][100],c[100][100]={0};
int m1,n1,m2,n2,i,j,k;
printf("請輸入矩陣A行數m1 列數n1:\n");
scanf("%d%d",&m1,&n1);
printf("請輸入矩陣B行數m2 列數n2:\n");
scanf("%d%d",&m2,&n2);
if(n1!=m2)
printf("\n不可以相乘\n");
else if((m1>100)||(n1>100)||(m2>100)||(n2>100))
printf("越界!!");
else{
for(i=0;i<m1;i++)
for(j=0;j<n1;j++){
printf("a[%d][%d]=:",i,j);
scanf("%d",&a[i][j]);}
printf("\n");
for(i=0;i<m2;i++)
for(j=0;j<n2;j++){
printf("b[%d][%d]=:",i,j);
scanf("%d",&b[i][j]);}
printf("\n矩陣C=A*B:\n");
for(i=0;i<m1;i++)
for(j=0;j<n2;j++){
for(k=0;k<n1;k++)
c[i][j]+=a[i][k]*b[k][j];
printf("%d",c[i][j]);
if(j==n2)
printf("\n");}}
return 0;}

E. C語言求個程序!!!!計算兩個矩陣乘積

#include<stdio.h>
#include<stdlib.h>
intmain()
{
unsignedintm,p,n;
inti,j,k,*a,*b,*c;
scanf("%d%d%d",&m,&p,&n);
a=malloc(m*p*sizeof(int));
for(i=0;i<m;i++)
for(j=0;j<p;j++)
scanf("%d",&a[i*p+j]);
b=malloc(p*n*sizeof(int));
for(i=0;i<p;i++)
for(j=0;j<n;j++)
scanf("%d",&b[i*n+j]);
c=calloc(m*n,sizeof(int));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<p;k++)
c[i*n+j]+=a[i*p+k]*b[k*n+j];
printf(" ");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d",c[i*n+j]);
printf(" ");
}
free(a);free(b);free(c);
return0;
}

F. c語言,兩矩陣相乘問題

沒有細看,是不是維數問題。
給你一個程序,計算:
a[a_row][a_col] * b[b_row][b_col]=c[a_row][b_col]
注意 b_row==a_col
DEBUG 為 1 輸出中間結果,方便查錯。 可以改為 0。
動態分配數組。
含輸入例子。
#include<stdio.h>
#include <stdlib.h>
#define DEBUG 1
void show_array(int *a, int row,int col);
/*---------------------
c[j]][i] = a[j][k] * b[k][i] = c[j][i]
a[c_row][nk]: a[3][2]={1,2,3,4,5,6}
b[nk][c_col]: b[2][3]={1,2,3,4,5,6}
c[c_row][c_col]: c[3][3]={9,12,15,19,26,33,29,40,51}
*---------------------*/
void matrix2(int *a,int *b, int *c, int a_row, int b_col, int b_row)
{
int i,j,k;
int a_col,c_row,c_col;
a_col=b_row; c_row=a_row; c_col=b_col;
if (DEBUG==1){
printf("A[%d][%d]:\n",a_row,a_col);
show_array(a,a_row,a_col);
printf("B[%d][%d]:\n",b_row,c_col);
show_array(b,b_row,b_col);
};
for(j=0;j<c_row;j++){
for(i=0;i<c_col;i++){
c[j*c_col+i]=0;
for(k=0;k<a_col;k++) c[j*c_col+i]+= a[j*a_col+k] * b[k*b_col+i];
};
};
}

main()
{
int i,j,k,tmp;
int a_row,a_col,b_row,b_col,c_row,c_col;
int *a,*b,*c;
printf("please enter a_row a_col of matrix_A: 3 2\n");
scanf("%d %d",&a_row,&a_col);
b_row = a_col;
printf("please enter b_col of matrix_B: 3\n");
scanf("%d",&b_col);
c_row = a_row;
c_col = b_col;

a = (int *) malloc(sizeof(int *) * a_row * a_col);
b = (int *) malloc(sizeof(int *) * b_row * b_col);
c = (int *) malloc(sizeof(int *) * c_row * c_col);

if (!c) { printf("no enought memory for alloc\n");return 0; }

printf("Please input int matrix a[%d][%d] 1 2 3 4 5 6\n",a_row,a_col);
for (j=0;j<a_row;j++)
for (i=0;i<a_col;i++){
scanf("%d",&tmp);
a[j*a_col+i] = tmp;
}
printf("Please input int matrix b[%d][%d] 1 2 3 4 5 6\n",b_row,b_col);
for (j=0;j<b_row;j++)
for (i=0;i<b_col;i++){
scanf("%d",&tmp);
b[j*b_col+i] = tmp;
}
if (DEBUG==1){
printf("A[%d][%d]:\n",a_row,a_col);
show_array(a,a_row,a_col);
printf("B[%d][%d]:\n",b_row,c_col);
show_array(b,b_row,b_col);
};
matrix2( a,b,c, a_row, b_col, b_row);
show_array(c,c_row,c_col);
free(a);free(b);free(c);
return 0;
}
void show_array(int *a, int row,int col)
{
int i,j;
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%d ",a[j*col+i]);
printf("\n");
}
printf("--------------------\n");
}

G. 求高手幫忙用c語言求出兩個矩陣的乘積

1、首先打開編程軟體,新建一個項目,添加一個double.cpp文件,如圖所示。

H. C語言求兩矩陣乘積

#include"stdio.h"
#defineLANGA4
#defineLANGB3
#defineLANGCLANGB
intmulti(doubleA[][LANGA],doubleB[][LANGB],doubleC[][LANGC],intlanga,intlangb,intlangc){
inti,j,k;
if(langa==LANGB&&langb==LANGA){
for(i=0;i<langa;i++)
for(j=0;j<langc;j++)
for(C[i][j]=k=0;k<langb;k++)
C[i][j]+=A[i][k]*B[k][j];
return0;
}
return-1;
}
intmain(intargv,char*argc[]){
doubleA[LANGB][LANGA],B[LANGA][LANGB],C[LANGB][LANGC];
inti,j;
for(i=0;i<LANGB;i++)
for(j=0;j<LANGA;A[i][j++]=1.0/(i+j+1));
for(i=0;i<LANGA;i++)
for(j=0;j<LANGB;B[i][j]=1.0+j++);
if(multi(A,B,C,LANGB,LANGA,LANGB))
return-1;
for(i=0;i<LANGB;i++){
for(j=0;j<LANGC;printf("%12.4le",C[i][j++]));
printf(" ");
}
return0;
}

運行樣例:

I. c語言初學求兩個矩陣乘積問題

若然一矩陣的列數與另一矩陣的行數相等,則可定義這兩個矩陣的乘積。如A是m×n矩陣和B是n×p矩陣,它們是乘積AB是一個m×p矩陣,其中

(AB)[i,j]=A[i,1]*B[1,j]+A[i,2]*B[2,j]+...+A[i,n]*B[n,j]對所有i及j。

此乘法有如下性質:

(AB)C=A(BC)對所有k×m矩陣A,m×n矩陣B及n×p矩陣C("結合律").

(A+B)C=AC+BC對所有m×n矩陣A及B和n&tiems;k矩陣C("分配律")。

C(A+B)=CA+CB對所有m×n矩陣A及B和k×m矩陣C("分配律")。

要注意的是:可置換性不一定成立,即有矩陣A及B使得AB≠BA。

Q=M*N(Q的行數和M相同,列數和N相同)

其中,M是m1*n1矩陣,N是m2*n2矩陣。當n1=m2時有:

for(i=1;i<=m1;++i)

for(j=1;j<=n2;++j){

Q[i][j]=0;

for(k=1;k<=n1;++k)Q[i][j]+=M[i][k]*N[k][j];

}

J. C語言:編寫完整程序:計算兩個矩陣的乘積。

#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
void caidan();

#define max 12500

typedef struct{
int e;
int i; //行下標
int j; //列下標
}triple;

typedef struct{
triple data[max+1];
int rpos[10];
int m,n,t;
}ts;

//矩陣的轉置實現函數
void fasttransposesmatrix(ts M,ts &T)
{
int col,num[10],cpot[10]={0},p,q;
T.m=M.n;
T.n=M.m;
T.t=M.t;
if(T.t){
for(col=1;col<=M.n;++col)
num[col]=0;
for(int t1=1;t1<=M.t;++t1)
++num[M.data[t1].j];
cpot[1]=1;
for(col=2;col<=M.n;++col)
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M.t;++p){
col=M.data[p].j;
q=cpot[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++cpot[col];
}
}
}
//矩陣的乘法Y=M*Q實現函數
void multsmatrix(ts M,ts Q,ts &Y){
int arow,brow=0,p,q,i1,tp,t1,ctemp[10],ccol;
if(M.n!=Q.m)
cout<<"錯誤!"<<endl;
Y.m=M.m;
Y.n=Q.n;
Y.t=0;
if(M.t*Q.t!=0)
{
for(arow=1;arow<=M.m;++arow)
{
for(i1=1;i1<=M.m;i1++)
ctemp[i1]=0;
Y.rpos[arow]=Y.t+1;
if(arow<M.m)
tp=M.rpos[arow+1];
else
tp=M.t+1;
for(p=M.rpos[arow];p<tp;++p)
{
brow=M.data[p].j;
if(brow<Q.m)
t1=Q.rpos[brow+1];
else
t1=Q.t+1;
for(q=Q.rpos[brow];q<t1;++q)
{
ccol=Q.data[q].j;
ctemp[ccol]+=M.data[p].e*Q.data[q].e;
}
}
for(ccol=1;ccol<=Y.n;++ccol)
if(ctemp[ccol]){
++Y.t;
if(++Y.t>max)
cout<<"錯誤"<<endl;
Y.data[Y.t].i=arow;
Y.data[Y.t].j=ccol;
Y.data[Y.t].e=ctemp[ccol];
cout<<Y.data[Y.t].i<<Y.data[Y.t].j<<Y.data[Y.t].e<<endl;
}
}
}
}

//將數組轉換成三元組
void exchange1(int **a,ts &M,int m,int n)
{
int i1,j1,z=1,pos[10];
for(i1=0;i1<=n;i1++)
{
pos[i1]=0;
M.rpos[i1]=0;
}
pos[0]=1;
for(i1=0;i1<m;i1++)
for(j1=0;j1<n;j1++)
if(a[i1][j1])
{
M.data[z].i=i1+1;
M.data[z].j=j1+1;
M.data[z].e=a[i1][j1];
z++;
pos[i1+1]++;
}
for(i1=0;i1<=m;i1++)
{
M.rpos[i1+1]=M.rpos[i1]+pos[i1];
}
M.t=z-1;
M.m=m;
M.n=n;
}
//將三元組轉換成數組形式
void exchange2(int **a,ts &T)
{
int i1,j1,z1;
for(i1=0;i1<T.m;i1++)
for(j1=0;j1<T.n;j1++)
{
a[i1][j1]=0;
}

for(z1=1;z1<=T.t;z1++)
for(i1=0;i1<T.m;i1++)
for(j1=0;j1<T.n;j1++)
if((i1==T.data[z1].i-1)&&(j1==T.data[z1].j-1))

{
a[i1][j1]=T.data[z1].e;
}
}

//輸出結果
void output(int **a,int m,int n)
{
int i1,j1;
for(i1=0;i1<m;i1++)
{
for(j1=0;j1<n;j1++)
{
cout<<a[i1][j1]<<',';
}cout<<endl;
}
}
//轉置的操作函數
void zhuan(){
int i1,j1,m,n;
cout<<"初始矩陣:"<<endl;
cout<<"請輸入你要輸入的數組的行數:"<<endl;
cin>>m;
cout<<"請輸入你要輸入的數組的列數:"<<endl;
cin>>n;
int**pp=new int*[m];
for(i1=0;i1<m;i1++)
pp[i1]=new int[n];
cout<<"請依次輸入矩陣的元素:"<<endl;
for(i1=0;i1<m;i1++)
for(j1=0;j1<n;j1++)
{
cin>>pp[i1][j1];
}
cout<<endl;
ts M,T;
exchange1(pp,M,m,n);
fasttransposesmatrix(M,T);

int**pp1=new int*[T.m];
for(i1=0;i1<T.m;i1++)
pp1[i1]=new int[T.n];

exchange2(pp1,T);
cout<<"轉置後的矩陣是:"<<endl;
output(pp1,T.m,T.n);
delete pp;
delete pp1;
caidan();

}
//相乘的操作函數
void xiangcheng(){
ts M,Q,Y;
int i1,j1,m,n;
cout<<"請輸入你要輸入的數組的行數:"<<endl;
cin>>m;
cout<<"請輸入你要輸入的數組的列數:"<<endl;
cin>>n;
int**p=new int*[m];
for(i1=0;i1<m;i1++)
p[i1]=new int[n];
cout<<"請依次輸入矩陣的元素:"<<endl;
for(i1=0;i1<m;i1++)
for(j1=0;j1<n;j1++)
{
cin>>p[i1][j1];
}
cout<<endl;
exchange1(p,M,m,n);
cout<<"請再次輸入一個矩陣(即乘數):"<<endl;
cout<<"請輸入你要輸入的數組的行數:"<<endl;
cin>>m;
cout<<"請輸入你要輸入的數組的列數:"<<endl;
cin>>n;
int**p2=new int*[m];
for(i1=0;i1<m;i1++)
p2[i1]=new int[n];
cout<<"請依次輸入矩陣的元素:"<<endl;
for(i1=0;i1<m;i1++)
for(j1=0;j1<n;j1++)
{
cin>>p2[i1][j1];
}
cout<<endl;
exchange1(p2,Q,m,n);

multsmatrix(M,Q,Y);
int**p1=new int*[Y.m];
for(i1=0;i1<Y.m;i1++)
p1[i1]=new int[Y.n];
exchange2(p1,Y);
cout<<"兩矩陣相乘結果為:"<<endl;
output(p1,Y.m,Y.n);
delete p2;
delete p1;
caidan();
}
//菜單
void caidan()
{
int i;
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<" 1.矩陣的轉置 2.兩個矩陣的乘法 3.退出 "<<endl;
cout<<"請選擇:"<<endl;
cin>>i;
switch(i){
case 1:zhuan();
break;
case 2:xiangcheng();
break;
case 3: exit(0);
}
}
//主函數
void main()
{
caidan();
}

熱點內容
我配置很高了ae為什麼卡 發布:2025-05-17 14:54:50 瀏覽:167
python數據分析實戰pdf 發布:2025-05-17 14:49:42 瀏覽:950
海瀾之家廣告腳本 發布:2025-05-17 13:56:06 瀏覽:30
手文件夾恢復 發布:2025-05-17 13:53:32 瀏覽:993
linux怎麼看進程 發布:2025-05-17 13:53:30 瀏覽:303
thinkphp欄位緩存 發布:2025-05-17 13:52:01 瀏覽:575
山靈app安卓版如何設置 發布:2025-05-17 13:51:49 瀏覽:388
帆布壓縮袋 發布:2025-05-17 13:26:27 瀏覽:457
c語言16進製表示方法 發布:2025-05-17 13:11:25 瀏覽:480
ftp單位 發布:2025-05-17 13:10:03 瀏覽:142