矩陣演算法c
⑴ 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;
}