1. 用c語言計算矩陣加法和乘法
謝謝你的回答,但是我看完你這個還有一個問題,你這里k
i都是<2,而j<3,那意思不不就是每組數都被捨去了
兩個數么,還是說矩陣乘法就是這樣的規則,說實話我對矩陣乘法確實不了解了.
2. 求c語言矩陣加法和乘法代碼
#include<stdio.h>
#include<stdlib.h>
void memory(int **p,int m,int n); //分配的內存的函數;
void readdata(int**p,int m,int n);
void plus(int **u,int **i,int m,int n); //求和函數,要求兩個矩陣同型
void re(int **u,int **i,int m,int n); //求差,要求兩個矩陣同型
void mult(int **u,int **i,int m,int n); //矩陣的積;乘法要求前一個矩陣的行數等於後一個矩陣的列數;
void release(int **p,int m,int n); //釋放內存的函數;
int main() //也可使用switch語句來選擇求和求差求積
{
int m,n;
scanf("%d%d",&m,&n); //輸入m,n兩個數,確定矩陣要分配內存的大小
int **k,**q,**o;
memory(**k,m,n);
memory(**q,m,n);
memory(**o,m,n); //備用,用來存放結果的一塊內存;
readdata(**k,m,n);
readdata(**q,m,n);
plus(**k,**q,m,n);
re(**k,**q,m,n);
mult(**k,**q,m,n); //在本行加//則可不求矩陣乘法,使程序適用於一切m*n的矩陣加法;
realease(**k,m,n);
realease(**q,m,n);
}
void memory(int **p,int m,int n)
{
p=*(int**)malloc(m*sizeof(int*);
for(i=0;i<n;i++)
{
p[i]=*(int*)malloc(n*sizeof(int));
}
}
void release(int **p,int m,int n)
{
for(i=0;i<n;i++)
{
free(p[i]);
p[i]=0;
}
free(p);
p=0;
}
void readdata(int **p,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
scanf("%d",&p[i][j]); //要求用戶由行到列輸入矩陣的數據;
}
}
void plus(int **u,int **i,int m,int n)
{
int r,j;
for(r=0;r<m;r++)
{
for(j=0;j<n;j++)
printf("%5d",u[r][j]+i[r][j]);
printf("\n");
}
}
void re(int **u,int **i,int m,int n)
{
int r,j;
for(r=0;r<m;r++)
{
for(j=0;j<n;j++)
printf("%5d",u[r][j]-i[r][j]);
printf("\n");
}
void mult(int **u,int **i,int m,int n)
{
int r,j,k,d=0;
for(r=0;r<m;r++)
{
for(j=0;j<n;j++)
{
for(k=0;k<m;k++) //這里分號錯寫成了逗號
d=d+u[r][k]*i[k][r];
printf("%d",d);
}
d=0;
printf("\n");
}
}
3. 求通過C語言實現矩陣的加、減及乘法。要自己寫的,不要復制過來
#include <iostream>
using namespace std;
int main()
{
int am=3,bm=3,an=3,bn=3;
int a[am][an];
int b[bm][bn];
for(int i=0;i<am;i++)
{
for(int j=0;j<an;j++)
{
a[i][j]=i*am+j;
}
}
for(int i=0;i<bm;i++)
{
for(int j=0;j<bn;j++)
{
b[i][j]=i*bm+j;
}
}
//original matrix
cout<<"原始矩陣a"<<endl;
for(int i=0;i<am;i++)
{
for(int j=0;j<an;j++)
{
cout<<a[i][j]<<" ";
if(j==an-1)
cout<<endl;
}
}
cout<<"原始矩陣b"<<endl;
for(int i=0;i<bm;i++)
{
for(int j=0;j<bn;j++)
{
cout<<b[i][j]<<" ";
if(j==bn-1)
cout<<endl;
}
}
//matrix add
cout<<"矩陣加法"<<endl;
if(am!=bm || an!=bn)
{
cout<<"Sorry, can not be added!"<<endl;
}
else for(int i=0;i<am;i++)
{
for(int j=0;j<an;j++)
{
cout<<a[i][j]+b[i][j]<<" ";
if(j==an-1)
cout<<endl;
}
}
//matrix minus
cout<<"矩陣減法"<<endl;
if(am!=bm || an!=bn)
{
cout<<"Sorry, can not be minused!"<<endl;
}
else for(int i=0;i<am;i++)
{
for(int j=0;j<an;j++)
{
cout<<a[i][j]-b[i][j]<<" ";
if(j==an-1)
cout<<endl;
}
}
//matrix multiply
cout<<"矩陣乘法"<<endl;
int temp;
if(an!=bm)
{
cout<<"Sorry, can not be multiplied!"<<endl;
}
else for(int i=0;i<am;i++)
{
for(int j=0;j<bn;j++)
{
temp=0;
for(int k=0;k<an;k++)
{
temp+=a[i][k]*b[j][k];
}
cout<<temp<<" ";
if(j==bn-1)
cout<<endl;
}
}
}
4. C語言實現的矩陣加減乘法
#include<stdio.h>
/*
m1和m2為兩個相加的數組首元素地址,r和c為兩個數組的行數和列數
m用於存放結果。
調用該函數時,要求m為有足夠存儲單元、能容納運算結果的數組首元素地址
*/
void add(int *m,int *m1,int *m2,int r,int c);
void sub(int *m,int *m1,int *m2,int r,int c);
void mult(int *m,int *m1,int *m2,int r,int p,int c);
void disp(int *m,int r,int c);
void main()
{
int a[3][4]={{2,4,6,8},{1,3,5,7},{11,33,44,22}};
int b[3][4]={{2,-4,6,-8},{-1,3,-5,7},{11,-33,-44,22}};
int c[4][3]={{2,4,6},{1,3,5},{1,0,3},{0,2,4}};
int d[3][4]={0};
int e[3][3]={0};
printf("\nA(3x4):\n");
disp(a[0],3,4);
printf("\nB(3x4):\n");
disp(b[0],3,4);
add(d[0],a[0],b[0],3,4);
printf("\nD(3x4)=A+B:\n");
disp(d[0],3,4);
sub(d[0],a[0],b[0],3,4);
printf("\nD(3x4)=A-B:\n");
disp(d[0],3,4);
printf("\nA(3x4):\n");
disp(a[0],3,4);
printf("\nC(4x3):\n");
disp(c[0],4,3);
mult(e[0],a[0],c[0],3,4,3);
printf("\nE(3x3)=A*C:\n");
disp(e[0],3,3);
}
void add(int *m,int *m1,int *m2,int r,int c){
int i,j;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
*(m+i*c+j) = *(m1+i*c+j) + *(m2+i*c+j);
}
void sub(int *m,int *m1,int *m2,int r,int c){
int i,j;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
*(m+i*c+j) = *(m1+i*c+j) - *(m2+i*c+j);
}
void mult(int *m,int *m1,int *m2,int r,int p,int c){
int i,j,k,t;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
{
t=0;
for(k=0; k<p; k++)
t += *(m1+i*p+k) * *(m2+k*c+j);
*(m+i*c+j)=t;
}
}
void disp(int *m,int r,int c)
{
int i,j;
for(i=0; i<r; i++)
{
for(j=0; j<c; j++)
printf("%6d",*(m+i*c+j));
printf("\n");
}
}
5. 稀疏矩陣的加法和乘法c語言(十字鏈演算法)
你沒有寫具體要求,是用採用三元組作存儲結構還是數組,下面是我們以前做過的數據結構習題你參考一下:
能區分加法、減法、乘法和轉置;能處理任意輸入的典型數據和進行出錯數據處理(例如乘法,當第一個矩陣的列數不等於第二個矩陣的行數時);必須採用三元組作存儲結構,不能採用數組等形式;輸出要求用矩陣的形式輸出(即習題集136頁的形式),當第一個矩陣的行數不等於第二個矩陣的行數時,注意如第三個乘法的形式輸出
******************************************************************************************
#include<stdio.h>
#define maxsize 100
typedef struct
{
int i,j; //該非零元的行和列
int v; //該非零元的值
}triple;
typedef struct
{
triple data[maxsize]; //非零元三元組表,data[0]未用
int rpos[maxsize];
int m,n,t; //矩陣的行數,列數和非零元個數
}tripletable;
void convert() //矩陣的轉置
{
int k;
tripletable A,B;
printf("輸入稀疏矩陣A的行數,列數和非零元個數:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
B.m=A.m;B.n=A.n;B.t=A.t;
if(B.t)
{
int q=1,col;
for(col=1;col<=A.n;++col)
for(int p=1;p<=A.t;++p)
if(A.data[p].j==col)
{
B.data[q].i=A.data[p].j;
B.data[q].j=A.data[p].i;
B.data[q].v=A.data[p].v;
++q;
}
}
int shuru[100][100]={0};
for(k=1;k<=B.t;k++)
{
shuru[B.data[k].j][B.data[k].i]=B.data[k].v;
}
printf("輸入為:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",shuru[k][l]);
printf("\n");
}
int result[100][100]={0};
for(k=1;k<=B.t;k++)
{
result[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("結果為:\n");
for(k=1;k<=B.n;k++)
{
for(int l=1;l<=B.m;l++)
printf("%d ",result[k][l]);
printf("\n");
}
}
void add() //矩陣的加法
{
int k;
tripletable A,B;
printf("輸入稀疏矩陣A的行數,列數和非零元個數:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("輸入稀疏矩陣B的行數,列數和非零元個數:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("輸入錯誤:A與B的行數或列數不相同,請重新輸入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A輸入為:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B輸入為:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]+b[k][l];
}
}
printf("加法結果C為:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void jian() //矩陣的減法
{
int k;
tripletable A,B;
printf("輸入稀疏矩陣A的行數,列數和非零元個數:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
printf("輸入稀疏矩陣B的行數,列數和非零元個數:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
if(A.m!=B.m||A.n!=B.n)
{
printf("輸入錯誤:A與B的行數或列數不相同,請重新輸入\n");
return;
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A輸入為:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B輸入為:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
{
c[k][l]=a[k][l]-b[k][l];
}
}
printf("減法結果C為:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void multi() //矩陣的乘法
{
int k;
tripletable A,B,C;
printf("輸入稀疏矩陣A的行數,列數和非零元個數:");
scanf("%d %d %d",&A.m,&A.n,&A.t);
for(k=1;k<=A.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].v);
}
int row=1;
for(k=1;k<=A.t;k++)
{
while(row<=A.data[k].i)
{
A.rpos[row++]=k;
}
}
while(row<=A.m)A.rpos[row++]=A.t+1;
printf("輸入稀疏矩陣B的行數,列數和非零元個數:");
scanf("%d %d %d",&B.m,&B.n,&B.t);
for(k=1;k<=B.t;k++)
{
printf("輸入第%d個非0元素的行數,列數和值:",k);
scanf("%d %d %d",&B.data[k].i,&B.data[k].j,&B.data[k].v);
}
row=1;
for(k=1;k<=B.t;k++)
{
while(row<=B.data[k].i)
{
B.rpos[row++]=k;
}
}
while(row<=B.m)B.rpos[row++]=B.t+1;
if(A.n!=B.m)
{
printf("輸入錯誤:A的列數不等於B的行數,請重新輸入\n");
return;
}
C.m=A.m;C.n=B.n;C.t=0;
int arow,p,q,ccol,t,tp;
if(A.t*B.t!=0)
{
for(arow=1;arow<=A.m;++arow)
{
int ctemp[maxsize]={0};
C.rpos[arow]=C.t+1;
if(arow<A.m){tp=A.rpos[arow+1];}
else{tp=A.t+1;}
for(p=A.rpos[arow];p<tp;++p)
{
int brow=A.data[p].j;
if(brow<B.m){t=B.rpos[brow+1];}
else{t=B.t+1;}
for(q=B.rpos[brow];q<t;++q)
{
ccol=B.data[q].j;
ctemp[ccol]+=A.data[p].v*B.data[q].v;
}
}
for(ccol=1;ccol<=C.n;++ccol)
{
if(ctemp[ccol])
{
if(++C.t>maxsize)return;
C.data[C.t].i=arow;
C.data[C.t].j=ccol;
C.data[C.t].v=ctemp[ccol];
}
}
}
}
int a[100][100]={0};
for(k=1;k<=A.t;k++)
{
a[A.data[k].i][A.data[k].j]=A.data[k].v;
}
printf("A輸入為:\n");
for(k=1;k<=A.m;k++)
{
for(int l=1;l<=A.n;l++)
printf("%d ",a[k][l]);
printf("\n");
}
int b[100][100]={0};
for(k=1;k<=B.t;k++)
{
b[B.data[k].i][B.data[k].j]=B.data[k].v;
}
printf("B輸入為:\n");
for(k=1;k<=B.m;k++)
{
for(int l=1;l<=B.n;l++)
printf("%d ",b[k][l]);
printf("\n");
}
int c[100][100]={0};
for(k=1;k<=C.t;k++)
{
c[C.data[k].i][C.data[k].j]=C.data[k].v;
}
printf("乘法結果C為:\n");
for(k=1;k<=C.m;k++)
{
for(int l=1;l<=C.n;l++)
printf("%d ",c[k][l]);
printf("\n");
}
}
void main()
{
printf("============= 菜 單 ==============\n");
printf(" 1 矩陣轉置\n");
printf(" 2 矩陣加法\n");
printf(" 3 矩陣減法\n");
printf(" 4 矩陣乘法\n");
printf("======================================\n\n");
loop: printf("請選擇相應操作的序號:");
int y;
scanf("%d",&y);
switch(y)
{
case 1: convert();
printf("\n");
goto loop;
case 2: add();
printf("\n");
goto loop;
case 3: jian();
printf("\n");
goto loop;
case 4: multi();
printf("\n");
goto loop;
}
}
6. 如何用C語言編程實現矩陣相加、相乘
矩陣相加會簡單點,設a[2][3]和b[2][3],只要在相應的地方相加就行了,
for(i=0;i<2;i++)
for(j=0;j<3;j++)
c[i][j]=a[i][j]+b[i][j];
兩矩陣相乘,
int a[][3]={1,2,3,4,5,6,7,8,9};//A為N×P矩陣,
//假設是3*3的矩陣
int b[][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//B為P×M矩陣,假設是3*5的矩陣
int c[3][5]={0};//結果矩陣3*5
for(int i=0;i<3;i++)
for(int j=0;j<5;j++)
for(int k=0;k<3;k++)
c[i][j]+=a[i][k]*b[k][j];
7. 用c語言編寫矩陣的加減乘除運算
#include <iostream>
#include <iomanip>
using namespace std;
template <typename T1,typename T2>
void inverse(T1*mat1,T2 *mat2,int a,int b);
template <typename T1,typename T2>
void multi(T1*mat1,T2*mat2,T2*result,int a,int b,int c);
template <typename T>
void output(T*mat,char *s,int a,int b);
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};
char*s1="result";
char*s2="middle";
//inverse(matrix1,middle,6,3);
inverse<int[6],int[3]>(matrix1,middle,6,3);
//multi(middle,matrix2,result,6,3,4);
multi<int[3],int[4]>(middle,matrix2,result,6,3,4);
output(matrix1,"matrix1",3,6);
output(middle,s2,6,3);
output(matrix2,"matrix2",3,4);
output(result,s1,6,4);
return 0;
}
template <typename T1,typename T2>
void inverse(T1*mat1,T2*mat2,int a,int b){
int i,j;
for(i=0;i<b;i++)
for(j=0;j<a;j++)
mat2[j][i]=mat1[i][j];
return;
}
template <typename T1,typename T2>
void multi(T1*mat1,T2*mat2,T2*result,int a,int b,int c){
int i,j,k;
for(i=0;i<a;i++){
for(j=0;j<c;j++){
result[i][j]=0;
for(k=0;k<b;k++)
result[i][j]+=mat1[i][k]*mat2[k][j];
}
}
return;
}
template<typename T>
void output(T*mat,char*s,int a,int b){
int i,j;
cout<<s<<endl;
for(i=0;i<a;i++){
for(j=0;j<b;j++)
cout<<setw(6)<<mat[i][j];
cout<<endl;
}
return;
}
8. 用C語言設計一個程序:支持矩陣加減乘運算的程序
用數組存儲數組
矩陣的加法、減法,相當於數組中元素分別相加相減
矩陣乘法,是用第1個矩陣的各行,分別與第2個矩陣的各列,元素一一相乘後相加,得到的和
作為結果矩陣的元素
9. 兩個矩陣的相加相乘用c語言的指針方式!急在線等
#include "stdio.h"
#include "stdlib.h"
#define M 3
#define N 3
//指針數組
int a[M][N];
int b[M][N];
int c[M][N];
void matrixMul(int b[][M],int c[][N]);
void matrixAdd(int b[][N],int c[][N]);
void matrixSub(int b[][N],int c[][N]);
int main()
{
int i,j,temp=0;
printf("Please input int matrix b[%d][%d]\n",M,N);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
scanf("%d",&temp);
b[i][j]=temp;
}
printf("Please input int matrix c[%d][%d]\n",M,N);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
scanf("%d",&temp);
c[i][j]=temp;
}
}
//輸出原矩陣
printf("Now print resource matrix b[%d][%d]=",M,N);
for(i=0;i<M;i++){
printf("\n");
for(j=0;j<N;j++)
printf("%d ",b[i][j]);
}
printf("\n");
printf("Now print resource matrix c[%d][%d]=",M,N);
for(i=0;i<M;i++){
printf("\n");
for(j=0;j<N;j++)
printf("%d ",c[i][j]);
}
if (M == N)
{
matrixMul(b,c); //調用矩陣相乘
//輸出矩陣相乘結果
printf("\n");
printf("Now printm matrixMul results matrix a[%d][%d]=B*C:",M,N);
for(i=0;i<M;i++)
{
printf("\n");
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
}
}
else
{
printf("matrix Error,check and try again!!! ");
}
//輸出矩陣相加結果
matrixAdd(b,c);
printf("\n");
printf("Now printm matrixAdd results matrix a[%d][%d]=B+C:",M,N);
for(i=0;i<M;i++)
{
printf("\n");
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
}
10. !!!跪求C語言實現矩陣運算(加,減,乘、求逆、轉置)
1、首先打開vs2015(其他版本也可以),新建一個Windows Form窗體程序或者控制台都可以。