當前位置:首頁 » 操作系統 » 矩陣演算法c

矩陣演算法c

發布時間: 2023-05-12 16:49:55

c語言矩陣運算

#include<vector>
#include<iostream>
intmain()
{
usingnamespacestd;
intm,n,p;
vector<vector<int>>A,B,C;
cout<<"pleaseinputm,n,p"<<endl;
cin>>m>>n>>p;
vector<int>tmp;
intttp;
for(inti=0;i<m;i++)
{
for(intj=0;j<n;j++)
{
cin>>ttp;
tmp.push_back(ttp);
}
A.push_back(tmp);
tmp.clear();
}
for(inti=0;i<n;i++)
{
for(intj=0;j<p;j++)
{
cin>>ttp;
tmp.push_back(ttp);
}
B.push_back(tmp);
tmp.clear();
}
for(inti=0;i<m;i++)
{
for(intj=0;j<p;j++)
{
ttp=0;
for(intk=0;k<n;k++)
ttp=ttp+A[i][k]*B[k][j];
tmp.push_back(ttp);
}
C.push_back(tmp);
tmp.clear();
}
for(inti=0;i<m;i++)
{
for(intj=0;j<p;j++)
{
cout<<C[i][j]<<'';
}
cout<<endl;
}
system("pause");
}

現在是2017年10月15日,無意中回答了一道2011年12月09日的題,留念。

⑵ !!!跪求C語言實現矩陣運算(加,減,乘、求逆、轉置)

#include<stdio.h>
#include<math.h>

void jiafa()
{
int m,n;
float a[20][20],b[20][20],c[20][20];
int i,j;

printf("請輸入矩陣行數:");
scanf("%d",&m);
printf("請輸入矩陣列數:");
scanf("%d",&n);

printf("請輸入第一個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("請輸入第二個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&b[i][j]);

printf("矩陣相加的結果為:");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{
c[i][j]=a[i][j]+b[i][j];
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void jianfa()
{
int m,n;
float a[20][20],b[20][20],c[20][20];
int i,j;

printf("請輸入矩陣行數:");
scanf("%d",&m);
printf("請輸入矩陣列數:");
scanf("%d",&n);

printf("請輸入第一個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("請輸入第二個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&b[i][j]);

printf("矩陣相減的結果為:");
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{
c[i][j]=a[i][j]-b[i][j];
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void chengfa()
{
int m,n;
float s;
float a[20][20],b[20][20],c[20][20];
int i,j,k;

printf("請輸入矩陣行數:");
scanf("%d",&m);
printf("請輸入矩陣列數:");
scanf("%d",&n);

printf("請輸入第一個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

printf("請輸入第二個矩陣:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%4f",&b[i][j]);

for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
s=0;
for(k=0;k<n;k++)
{
s=s+a[i][k]*b[k][j];
c[i][j]=s;
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
printf("%4f ",c[i][j]);
}
printf("\n");
}
}

void zhuan()
{
int m,n;
float a[20][20],b[20][20];
int i,j;

printf("請輸入矩陣行數:");
scanf("%d",&m);
printf("請輸入矩陣列數:");
scanf("%d",&n);

printf("請輸入一個矩陣:");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);

for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
b[i][j]=a[j][i];
printf("%4f ",b[i][j]);
}
printf("\n");
}
}

void qiuni()
{
int N;
printf("輸入矩陣的階數N:\n");
scanf("%d",&N);
float a[10][10],b[10][20],c[10][10],t;
int i,j,m;
printf("請輸入行列式不為0的矩陣A(%d階):\n",N); //矩陣A的各元素存入二維數組a中。
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%f",&a[i][j]);
//增廣矩陣(A|E)存入二維數組b中
for(i=0;i<N;i++)
for(j=0;j<N;j++)
b[i][j]=a[i][j];

for(i=0;i<N;i++)
for(j=N;j<2*N;j++)
b[i][j]=0;

for(i=0;i<N;i++)
b[i][N+i]=1;

for(m=0;m<N;m++) //對每行進行處理。
{
t=b[m][m]; //預存b[m][m]。
i=m;
while(b[m][m]==0)
{
b[m][m]=b[i+1][m];
i++;
}

if(i>m)
{
b[i][m]=t; //實現交換。

//交換其它各列相應位置的元素
for(j=0;j<m;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}
for(j=m+1;j<2*N;j++)
{
t=b[m][j];
b[m][j]=b[i][j];
b[i][j]=t;
}

}

for(i=m+1;i<N;i++)
for(j=2*N-1;j>=m;j--)
b[i][j]-=b[i][m]*b[m][j]/b[m][m]; //m=0時,將第一行的-b[i][0]/b[0][0]倍加到以下各行。這樣以下每行第一個元素b[i][0]就為0。

for(j=2*N-1;j>=m;j--)
b[m][j]/=b[m][m]; //對第m行作行變換,同除以b[m][m],使b[m][m]為1。

}

printf("第一步變換後得到的增廣矩陣為:\n");
for(i=0;i<N;i++)
{
for(j=0;j<2*N;j++)
printf("%3.5f ",b[i][j]);
printf("\n"); //實現了:每個i對應一個換行。
}

m=N-1;
while(m>0)
{
for(i=0;i<m;i++)
for(j=2*N-1;j>=m;j--) //千萬注意,此處j必須遞減,否則b[i][m]先變為0,後面的計算就無效!
b[i][j]-=b[i][m]*b[m][j];
m--;
}

printf("最後得到的增廣矩陣為:\n");
for(i=0;i<N;i++)
{
for(j=0;j<2*N;j++)
printf("%3.5f ",b[i][j]);
printf("\n"); //實現了:每個i對應一個換行。
}

for(i=0;i<N;i++) //將逆矩陣存入二維數組c中。
for(j=0;j<N;j++)
c[i][j]=b[i][N+j];

printf("故逆矩陣為:\n");

for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%3.5f ",c[i][j]);
printf("\n"); //實現了:每個i對應一個換行。
}

}

main()
{
int w;
printf("1矩陣加法\n");
printf("2矩陣減法\n");
printf("3矩陣乘法\n");
printf("4矩陣轉置\n");
printf("5矩陣求逆\n");
printf("\n");
printf("請選擇要進行的運算:");
scanf("%d",&w);

switch(w)
{
case 1:jiafa();break;
case 2:jianfa();break;
case 3:chengfa();break;
case 4:zhuan();break;
case 5:qiuni();break;
}

return 0;
}

⑶ 用C語言編寫一個矩陣運算的程序,高分!

//矩陣三元組之矩陣相加 相乘
#include <iostream>
using namespace std;
typedef int Elemtype;
#define MAXSIZE 12500 //最大非零元素
typedef struct Triple
{
Elemtype value;
int row,col;
}Triple;

typedef struct TSMatrix
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
TSMatrix T;
void InputMatrix(TSMatrix &T) //輸入t個非零元素
{
cout<<"請輸入稀疏矩陣的信息,(行,列,非零元素個數)"<<endl;
cin>>T.mu>>T.nu>>T.tu;
int i;
cout<<"請輸入非零元素的信息(行,列,值),提醒(下標從1開始)"<<endl;
for(i=1;i<=T.tu;++i)
{
cin>>T.data[i].row>>T.data[i].col>>T.data[i].value;
}
}

void Output(TSMatrix T)
{
cout<<"矩陣的三元組表示(ROW=)"<<T.mu<<" COL="<<T.nu<<"非零個數="<<T.tu<<endl;
int i;
for(i=1;i<=T.tu;++i)
{
cout<<"ROW(行):"<<T.data[i].row<<" COL(列):"<<T.data[i].col<<" Value(值)"<<T.data[i].value<<endl;
}
}

void TransposeSMatrix(TSMatrix M,TSMatrix &T) //矩陣的轉置
{
T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
int i,j,k=1;
for(i=1;i<=M.nu;++i)
{
for(j=1;j<=M.tu;++j)
if(M.data[j].col==i)
{
T.data[k].row=i;
T.data[k].col=M.data[j].row;
T.data[k].value=M.data[j].value;
++k;
}
}
}

void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix &Q) //矩陣相加
{
int index_a,index_b,i=1,j=1,k=1;
Q.mu=M.mu; Q.nu=M.nu;
while (i<=M.tu&&j<=T.tu)
{
index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col;
index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col;
if(index_a<index_b)
{
Q.data[k]=M.data[i];
i++;
k++;
}
else if(index_a>index_b)
{
Q.data[k]=T.data[j];
j++;
k++;
}
else if(index_a==index_b)
{
if((M.data[i].value+T.data[j].value)!=0)
{
Q.data[k]=M.data[i];
Q.data[k].value=M.data[i].value+T.data[j].value;
k++;
}
++i;
++j;
}
}
//復制剩餘元素
for(;i<=M.tu;++i)
{
Q.data[k]=M.data[i];
k++;
}
for(;j<=T.tu;++j)
Q.data[k++]=T.data[j];
Q.tu=k-1;
}

void Multiply(TSMatrix M,TSMatrix T,TSMatrix &Q) //相乘
{
if(M.nu!=T.mu)
{
cerr<<"兩矩陣相乘不合法"<<endl;
return ;
}
int *rowSize=new int[T.mu+1]; //存放每行非零元素的個數
int *rowStart=new int[T.mu+2]; //矩陣每行在三元組開始位置
int *temp=new int[T.nu+1]; //存放結果矩陣中每行的計算結果
int i,Current,k,ROWM,COLM,COLB;
for(i=1;i<=T.mu;i++) rowSize[i]=0;
for(i=1;i<=T.tu;++i) rowSize[T.data[i].row]++;
rowStart[1]=1;
for(i=2;i<=T.mu+1;i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1];
Current=1; k=1;
while (Current<=M.tu)
{
ROWM=M.data[Current].row; //當前三元組數據中元素的行號
for(i=1;i<=T.nu;++i) temp[i]=0;
while (Current<=M.tu&&ROWM==M.data[Current].row)
{
COLM=M.data[Current].col; //當前元素的列號,方便與T矩陣的行號相乘
for(i=rowStart[COLM];i<rowStart[COLM+1];i++) //對應T矩陣中每行的個數
{
COLB=T.data[i].col;
temp[COLB]+=(M.data[Current].value)*(T.data[i].value);
}
Current++;
}
for(i=1;i<=T.nu;i++)
{
if(temp[i]!=0)
{
Q.data[k].row=ROWM;
Q.data[k].col=i;
Q.data[k].value=temp[i];
}
k++;
}
}
Q.mu=M.mu;Q.nu=T.nu;
Q.tu=k-1;
}
int main()
{
TSMatrix T,M,Q,S;
InputMatrix(M);
InputMatrix(T);
cout<<"兩矩陣相乘"<<endl;
Multiply(M,T,Q);
Output(Q);
cout<<"兩矩陣相加"<<endl;
AddMastrix(M,M,S);
Output(S);
system("pause");
return 0;
}

⑷ C語言程序設計方案!!二維數組應用 矩陣演算法 求高人

#include
<stdio.h>
void
input_data(int
*l,int
*r,int
data[100][100])
{
int
i,j,k;
printf("輸入矩陣行數:");
scanf("%d",l);
printf("輸入矩陣列數:");
scanf("%d",r);
printf("按行輸入數據,數據間用空格間隔:\n");
for(i=0;i<*l;i++)
for(j=0;j<*r;j++)
scanf("%d",&data[i][j]);
}
int
add_subtra(int
m1[100][100],int
l1,int
r1,
int
m2[100][100],int
l2,int
r2,char
m,int
rm[100][100])
{
int
i,j;
if(l1!=l2
||
r1!=r2)
{
printf("矩陣數據錯誤1.\n");
return;
}
if(m=='+')
for(i=0;i<l1;i++)
for(j=0;j<r1;j++)
rm[i][j]=m1[i][j]+m2[i][j];
else
for(i=0;i<l1;i++)
for(j=0;j<r1;j++)
rm[i][j]=m1[i][j]-m2[i][j];
}
int
mul(int
m1[100][100],int
l1,int
r1,
int
m2[100][100],int
l2,int
r2,int
m[100][100])
{
int
i,j,k;
if(l1!=r2
)
{
printf("矩陣數據錯誤2.\n");
return;
}
for(i=0;i<l1;i++)
for(j=0;j<r2;j++)
{
m[i][j]=0;
for(k=0;k<r1;k++)
m[i][j]+=m1[i][k]*m2[k][j];
}
}
int
output(int
m[100][100],int
l,int
r)
{
int
i,j;
for(i=0;i<l;i++)
{
for(j=0;j<r;j++)
printf("%3d
",m[i][j]);
printf("\n");
}
}
int
main()
{
int
d1[100][100],d2[100][100],d[100][100];
int
l1,r1,l2,r2;
int
i,j,k;
char
mark[2];
printf("輸入第一個矩陣數據:\n");
input_data(&l1,&r1,d1);
printf("輸入的第一個矩陣:\n");
output(d1,l1,r1);
printf("輸入第二個矩陣數據:\n");
input_data(&l2,&r2,d2);
printf("輸入的第二個矩陣:\n");
output(d2,l2,r2);
printf("指定運算符(+/-/*):");
scanf("%s",mark);
while(mark[0]!='+'
&&
mark[0]!='-'
&&
mark[0]!='*')
{
printf("符號錯誤請重新輸入(+/-/*):");
scanf("%s",mark);
}
switch(mark[0])
{
case
'+':
case
'-':
add_subtra(d1,l1,r1,d2,l2,r2,mark[0],d);
break;
case
'*':
mul(d1,l1,r1,d2,l2,r2,d);
break;
}
//output(d1,l1,r1);
//output(d2,l2,r2);
printf("運算:%c,計算結果為:\n",mark[0]);
output(d,l1,r2);
system("pause");
}
兩個運算矩陣可以是大小不同的,
輸出結果由被乘數矩陣的行和乘數矩陣的列決定,
你要求的輸出格式比較煩,沒時間不夠啦!有時間再玩吧。

⑸ c語言矩陣怎麼寫

方法1:直接定義10*10的數組,讀取全部數據,再根據選擇的行列數列印輸出部分數據。

方法2:通過文件流指針的移動,跨過不需要的內容。(這里控制文件流指針可利用ftell和fseek函數來移動指定位元組數)我是利用fscanf讀取需要的內容,遇到需要跳行就用fgets來跳過。(注意常量參數根據自己需求修改)。

說明:邊讀取邊列印輸出,就不需要變數存儲。我的代碼是把讀取出來的內容存放在三維數組中(文件內容你沒指定,如是單純數字,二維數組即可,我是作為字元串處理,故用三維數組。),數組是根據實際大小,動態申請,寫成兩個獨立函數。

下面是代碼:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#define MAXR 10//文件中矩陣最大行

#define MAXC 10//文件中矩陣最大列

#define MS 3//矩陣中元素字元串最大字元數(包含結束符號,不可小於實際內容)

#define MBUF 100//文件中一行最大字元數,可設置大一點

char ***getMem(int r,int c,int len);//動態申請一個三維數組

void freeMem(char ***datas,int r,int c);//釋放數組空間

void showDatas(char ***datas,int r,int c);//列印輸出結果

int main()

{

int r=MAXR+1,c=MAXC+1,i=0,j=0;

char ***datas=NULL,str[3],buf[MBUF];

FILE *fp=NULL;

printf("請輸入要獲取的行數和列數: ");

while(r<0 || r>MAXR || c<0 || c>MAXC)scanf("%d%d",&r,&c);

datas=getMem(r,c,MS);

fp=fopen("C:\test.data","r");

if(!fp) return 1;

while(fscanf(fp,"%s",str)!=-1)

{

if(i<c) strcpy(datas[j][i],str),i++;

if(i==c)

{

if(!fgets(buf,sizeof(buf),fp)) break;

i=0,j++;

}

if(j==r) break;

}

showDatas(datas,r,c);

freeMem(datas,r,c);

return 0;

}

void showDatas(char ***datas,int r,int c)

{

int i,j;

for(i=0;i<r;i++,printf(" "))

for(j=0;j<c;j++)

printf("%s ",datas[i][j]);

printf(" ");

}

void freeMem(char ***datas,int r,int c)

{

int i,j;

if(!datas)

{

for(i=0;i<r;i++,free(datas[i]))

for(j=0;j<c;j++)

free(datas[i][j]);

free(datas);

}


}

char ***getMem(int r,int c,int len)

{

int i,j;

char ***datas=NULL,**dr=NULL;

datas=(char ***)malloc(sizeof(char **)*r);

if(!datas) return NULL;

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

{

dr=(char **)malloc(sizeof(char *)*c);

if(!dr) return NULL;

else

{

for(j=0;j<c;j++)

{

dr[j]=(char *)malloc(sizeof(char)*len);

if(!dr[j]) return NULL;

}

datas[i]=dr;

}

}

return datas;

}

⑹ 用c語言實現兩個矩陣相乘怎麼做

1、程序運行輸入數據時,第一行為A矩陣的行列數和B矩陣的行列數,接著分別輸入A、B兩個矩陣的值。

⑺ C語言求矩陣運算,急

可以用二維數組模擬矩陣,乘法就是A的第一行乘對應B的第一列放在(1,1)位置,然後繼續往後乘。其實進行矩陣計算用MATLAB簡單的多或者C++的Armadillo。

⑻ c語言 旋轉矩陣演算法

#include <stdlib.h>
#include <stdio.h>
#define N 5

int min(int a,int b,int c,int d)
{
a=a<b?a:b;
a=a<c?a:c;
a=a<d?a:d;
return a;
}

int main()
{
int arr[N][N],i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
arr[i][j]=min(i,j,N-1-i,N-1-j);
printf("%d ",arr[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}

熱點內容
c語言編譯後圖片 發布:2025-05-15 13:51:57 瀏覽:792
沒有被調用的函數會參與編譯嗎 發布:2025-05-15 13:42:51 瀏覽:260
在計算機中ftp的中文 發布:2025-05-15 13:41:07 瀏覽:1000
國網校招要網簽密碼和賬號干什麼 發布:2025-05-15 13:40:25 瀏覽:179
java分 發布:2025-05-15 13:34:36 瀏覽:846
如何下載卡巴斯基安卓版 發布:2025-05-15 13:34:36 瀏覽:480
排序函數c語言 發布:2025-05-15 13:06:28 瀏覽:6
韓服lol掛機腳本 發布:2025-05-15 12:42:56 瀏覽:462
監控存儲伺服器如何調試 發布:2025-05-15 12:36:30 瀏覽:219
一萬級凈化車間有哪些配置 發布:2025-05-15 12:16:41 瀏覽:98