本文目錄一覽:
用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;
cinT.muT.nuT.tu;
int i;
cout”請輸入非零元素的信息(行,列,值),提醒(下標從1開始)”endl;
for(i=1;i=T.tu;++i)
{
cinT.data[i].rowT.data[i].colT.data[i].value;
}
}
void Output(TSMatrix T)
{
cout”矩陣的三元組表示(ROW=)”T.mu” COL=”T.nu”非零個數=”T.tuendl;
int i;
for(i=1;i=T.tu;++i)
{
cout”ROW(行):”T.data[i].row” COL(列):”T.data[i].col” Value(值)”T.data[i].valueendl;
}
}
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.tuj=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_aindex_b)
{
Q.data[k]=M.data[i];
i++;
k++;
}
else if(index_aindex_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.tuROWM==M.data[Current].row)
{
COLM=M.data[Current].col; //當前元素的列號,方便與T矩陣的行號相乘
for(i=rowStart[COLM];irowStart[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語言 關於矩陣?
方法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(“請輸入要獲取的行數和列數:\n”);
while(r0 || rMAXR || c0 || cMAXC)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(ic) 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;ir;i++,printf(“\n”))
for(j=0;jc;j++)
printf(“%s “,datas[i][j]);
printf(“\n”);
}
void freeMem(char ***datas,int r,int c)
{
int i,j;
if(!datas)
{
for(i=0;ir;i++,free(datas[i]))
for(j=0;jc;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;ir;i++)
{
dr=(char **)malloc(sizeof(char *)*c);
if(!dr) return NULL;
else
{
for(j=0;jc;j++)
{
dr[j]=(char *)malloc(sizeof(char)*len);
if(!dr[j]) return NULL;
}
datas[i]=dr;
}
}
return datas;
}
c語言矩陣運算
我在這兒給你提供一些思路:碼程序交給你自己了!
0、提示輸入4*4的實數矩陣,然後鍵盤依次輸入實數矩陣中各元素;在屏幕上先用printf輸出了4*4 矩陣的形式;
1、4*4的實數矩陣,那以為這定義一個float a[4][4]的4*4的二維矩陣或者float a[16]的一維矩陣;
2、求所有的元素中負數的個數,意思是把你把數組中每個數和0比較一遍,即循環16次,發現小於 0則把一個全局變量加1,就求出了所有的負數的個數!
3、二維數組循環通常用兩個for循環完成,再找一個全局變量用於求元素之和的。一維數組的話更 簡單
4、輸出(2)、(3)就把那2個全局變量的值輸出即可!
希望可以幫到你,如果滿意請採納!
其實你屏幕上顯示的是4*4矩陣的形式是輸入的,但是存儲可以使用長度為16的一維數組,這樣更加容易了!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/282798.html