當前位置:首頁 » 編程語言 » c語言課程設計矩陣操作
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言課程設計矩陣操作

發布時間: 2023-05-04 00:59:33

c語言編程(兩矩陣加減乘,轉置,讀入,保存,要求有菜單)

菜單培襲自己弄,就給你個範例。可以實現矩陣加,減,乘,及轉置

兩橋消個文件,一個叫Matrix.h, 一個叫Matrix.cpp

//Matrix.h

#ifndef _MATRIX_H_
#define _MATRIX_H_

#include <math.h>
#include <stdlib.h>
#include <float.h>
#include<iostream.h>
class matrixobj
{
float matrix[3][3];
float cofactor(int i,int j);

public:
void displayMatrix();
void readMatrix();

friend matrixobj operator+(matrixobj &x, matrixobj &y);
friend matrixobj operator-(matrixobj &x, matrixobj &y);
friend matrixobj operator*(matrixobj &x, matrixobj &y);
friend matrixobj operator/(matrixobj &x, float d);

float matrixDeterminent();
matrixobj matrixInverse();
matrixobj matrixTranspose();

};

void matrixobj::displayMatrix()
{
int i,j;
for (i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
cout<<敏中知matrix[i][j];
cout<<"\n"<<endl;
}
}

void matrixobj::readMatrix()
{
int i,j;
float x=0;
for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
{
cin>>x;
matrix[i][j] = x;
}
}

float matrixobj::cofactor(int i,int j)
{
float cofactorValue;
int a1,b1,c1,d1,a2,b2,c2,d2;

a1 = (i + 1) % 3;
b1 = (j + 1) % 3;
c1 = (i + 2) % 3;
d1 = (j + 2) % 3;

a2 = (i + 2) % 3;
b2 = (j + 1) % 3;
c2 = (i + 1) % 3;
d2 = (j + 2) % 3;

cofactorValue = matrix[a1][b1] * matrix[c1][d1] - matrix[a2][b2] * matrix[c2][d2];

return cofactorValue;
}

float matrixobj::matrixDeterminent()
{
float det;

det = matrix[0][0] * cofactor(0,0);
det += matrix[0][1] * cofactor(0,1);
det += matrix[0][2] * cofactor(0,2);

return det;
}

matrixobj matrixobj::matrixInverse()
{
float det;
int i,j;
matrixobj z,y;

det = matrixDeterminent();

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[i][j] = cofactor(i,j);

z = z.matrixTranspose();

if (det == (float) 0)
{

exit(0);
}

y = z / det;

return y;
}

matrixobj matrixobj::matrixTranspose()
{
int i,j;
matrixobj z;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[j][i] = matrix[i][j];

return z;
}

matrixobj operator+(matrixobj &x, matrixobj &y)
{
matrixobj z;
int i,j;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[i][j] = x.matrix[i][j] + y.matrix[i][j];

return z;
}

matrixobj operator-(matrixobj &x, matrixobj &y)
{
matrixobj z;
int i,j;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[i][j] = x.matrix[i][j] - y.matrix[i][j];

return z;
}

matrixobj operator*(matrixobj &x, matrixobj &y)
{
matrixobj z;
int i,j,k;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[i][j] = 0;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
for(k = 0; k < 3; k++)
z.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];

return z;
}

matrixobj operator/(matrixobj &x, float d)
{
int i,j;
matrixobj z;

for (i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
z.matrix[i][j] = x.matrix[i][j] / d;
cout<<"\n"<<endl;
return z;
}

#endif

// Matrix.cpp

#include <stdio.h>
#include <conio.h>
#include "matrix.h"
#include <float.h>
#include<iostream.h>
void main()
{
matrixobj a,b,c;
float x;

cout<<"Enter a 3 by 3 matrix (A): \n";
a.readMatrix();

cout<<"Enter a 3 by 3 matrix (B): \n";
b.readMatrix();

cout<<"Matrices (A) + (B) is : \n";
c = a + b;
c.displayMatrix();
getch();

cout<<"Matrices (A) - (B) is : \n";
c = a - b;
c.displayMatrix();
getch();

cout<<"Matrices (A) * (B) is : \n";
c = a * b;
c.displayMatrix();
getch();

x = a.matrixDeterminent();

getch();

c = a.matrixInverse();
c.displayMatrix();

getch();
}

㈡ C語言中如何定義矩陣

兩種方式可以參考:
1、最簡單的就是二維數組,比如存儲全是整形的一個m*n的矩陣。然後可以定義int a[m][n]。
輸入或者輸出可以用兩層循環來完成,外層控制行m比如for(i=0;i<m;++i),內層控制列n比如for(j=0;j<n;++j);
2、第二種方式就是壓縮矩陣進行存儲,如果學了數據結構應該比較好理解。
結構體進行封裝,比如:
第一步:先定義一個有效數據的位置
typedef struct node
{
int hang;int lie;int data;//用來存儲一個有效數據位的行列和值
}node;
typedef struct matrix
{
node *m;//一個數組,用來存儲所有的node數據
int sum;//記錄一共有多少個有效數據位
}matrix;

㈢ 數據結構(使用C語言)關於矩陣

你的測試數據不符合條件,不是對稱矩陣。但函數調試已調試好了,無誤。
#include <stdio.h>
#define N 3
#define M (N*N+N)/2
void add(int C[],int A[],int B[])
{
for(int i=0;i<M;i++)
C[i]=A[i]+B[i];
}
void print(int C[])
{
int i,j,t;
for(i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(i>=j) t=(i+1)*i/2+j;
else t=(j+1)*j/2+i; //下三角存儲
printf("%d ",C[t]);
}
printf("\n");
}
}
int main(void)
{
int a[N][N]={{1,2,3},{10,20,30},{2,4,5}};
int b[N][N]={{20,40,50},{3,5,6},{30,50,60}};
int A[M],B[M],C[M];
int i,j,t=0,k=0;
for(i=0;i<=2;i++)
for(j=0;j<=i;j++)
{
A[t++]=a[i][j];
B[k++]=b[i][j];
}
add(C,A,B);
print(C);
return 0;
}

㈣ 怎樣用C語言寫矩陣

用二維數組,如下:
#include <stdio.h>
main()
{
int i, j, a[4][4];

for ( i = 1; i < 4; i++ )
{
for ( j = 1; j < 4; j++ )
{
scanf ("%d", &a[i][j]);
}
}
//這樣就可以將一個3*3 的矩陣存在2維數組中了

for ( i = 1; i < 4; i++ )
{
for ( j = 1; j < 4; j++ )
{
printf (" %-4d ", a[i][j]);
}
printf ("\n");
}
//這樣就可以顯示矩陣
return 0;
}

㈤ C語言:編程 矩陣

#include<stdio.h>逗中
void main()
{ int a[4][2],b[2][4],i,j;
printf("鍵盤輸入一個4行2列的矩陣\鏈頃n");
for(i=0;i<4;i++)

for(j=0;j<2;j++)
scanf("%d",&a[i][j]);//按樓主意願,並非定義同時棚指陸初始化

for(i=0;i<4;i++)
for(j=0;j<2;j++)
b[j][i]=a[i][j];

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

}

㈥ C語言課程設計:稀疏矩陣應用 要求:實現三元組,十字鏈表下的稀疏矩陣的加、轉、乘的實現。

我剛寫了一個稀疏矩陣的代碼,如下
#include <iostream>
#include <iomanip>
using namespace std;

template<class T>
//三元組
struct Trituple
{
int row;
int col;
T val;
};
//稀疏矩陣聲明
template<class T>
class SparseMatrix
{
public:
SparseMatrix(int maxt=100);
~SparseMatrix();
bool TransposeTo(SparseMatrix &);
bool AddTo(const SparseMatrix&);
bool TransposeTo_Faster(SparseMatrix&);
void Input();
void Output();
private:
Trituple<T>* data;
int rows,cols,terms;
int maxterms;
};
template<class T>
SparseMatrix<T>::SparseMatrix(int maxt)
{
maxterms=maxt;
data=new Trituple<T>[maxterms];
terms=rows=cols=0;
}
template<class T>
SparseMatrix<T>::~SparseMatrix()
{
if (data!=NULL)
{
delete[] data;
}
}
//普通轉置
template<class T>
bool SparseMatrix<T>::TransposeTo(SparseMatrix &B)
{
if (terms>B.maxterms)
{
return false;
}
B.rows=cols;
B.cols=rows;
B.terms=terms;
if (terms>0)
{
int p=0;
for (int j=1;j<=cols;j++)
{
for (int k=0;k<terms;k++)
{
if (data[k].col==j)
{
B.data[p].row=j;
B.data[p].col=data[k].row;
B.data[p].val=data[k].val;
p++;
}
}
}
}
return true;
}
//快速轉置
template<class T>
bool SparseMatrix<T>::TransposeTo_Faster(SparseMatrix& B)
{
if (terms>B.maxterms)
{
return false;
}
B.rows=cols;
B.cols=rows;
B.terms=terms;
if (terms>0)
{
int *num,*cpot;
num=new int[cols];
cpot=new int[cols];
for (int j=0;j<cols;j++)
{
num[j]=0;
}
for (int k=0;k<terms;k++)
{
num[data[k].col-1]++;
}
//求出B中每一行的起始下標cpot[]
cpot[0]=0;
for (int j=1;j<cols;j++)
{
cpot[j]=cpot[j-1]+num[j-1];
}
//執行轉置操作
for (int p,k=0;k<terms;k++)
{
p=cpot[data[k].col-1]++;
B.data[p].row=data[k].col;
B.data[p].col=data[k].row;
B.data[p].val=data[k].val;
}
delete[] num;
delete[] cpot;
}
return true;
}
template<class T>
void SparseMatrix<T>::Input()
{
cout<<"intput the matrix' row:";
int row1;
cin>>row1;
cout<<"intput the matrix' col:";
int col1;
cin>>col1;
cout<<"input "<<row1<<"*"<<col1<<" matrix"<<endl;
int number;
rows=row1;
cols=col1;
for (int i=0;i<rows;i++)
{
for (int j=0;j<cols;j++)
{
cin>>number;
if (number!=0)
{
data[terms].row=i+1;
data[terms].col=j+1;
data[terms].val=number;
terms++;
}
}
}
}
template<class T> //輸出好看,但是違背了最初的原則
void SparseMatrix<T>::Output()
{
T **tempArray=new T*[rows];
for (int i1=0;i1<rows;i1++)
{
tempArray[i1]=new int[cols];
}
for (int j=0;j<rows;j++)
{
for (int k=0;k<cols;k++)
{
tempArray[j][k]=0;
}
}
for (int i=0;i<terms;i++)
{
tempArray[data[i].row-1][data[i].col-1]=data[i].val;
}
for (int j=0;j<rows;j++)
{
for (int k=0;k<cols;k++)
{
cout<<setw(4)<<tempArray[j][k];
}
cout<<endl;
}
for (int l=0;l<rows;l++)
{
delete[] tempArray[l];
}
delete tempArray;
cout<<endl;
}
template<class T>
bool SparseMatrix<T>::AddTo(const SparseMatrix& B)
{
if (rows!=B.rows||cols!=B.cols)
{
return false;
}
bool flag=false;
int tempTerms=terms;
for (int i=0;i<B.terms;i++)
{
flag=false;
for (int j=0;j<tempTerms;j++)
{
if (data[j].col==B.data[i].col&&data[j].row==B.data[i].row)
{
data[j].val+=B.data[i].val;
flag=true;
}
}
if (flag==false)
{
data[++terms-1].col=B.data[i].col; //數組下標操作注意事項
data[terms-1].row=B.data[i].row;
data[terms-1].val=B.data[i].val;
}
}
return true;
}
int main()
{
cout<<"此程序演示稀疏矩陣的普通轉置和快速轉置操作"<<endl;
SparseMatrix<int> sm(50);
SparseMatrix<int> sm1(50);
SparseMatrix<int> sm2(50);
sm.Input();
cout<<"sm is"<<endl;
sm.Output();
sm.TransposeTo(sm1);
cout<<"Transposition of sm is "<<endl;
sm1.Output();
sm.TransposeTo_Faster(sm2);
cout<<"Transposition of sm is "<<endl;
sm2.Output();
SparseMatrix<int> sm3;
cout<<"input a new matrix"<<endl;
sm3.Input();
cout<<"sm3 is"<<endl;
sm3.Output();
if(sm.AddTo(sm3))
{
cout<<"after adding sm3 ,sm is"<<endl;
sm.Output();
}
else
cout<<"the two matrix can't add"<<endl;
cout<<"Good job!"<<endl;
system("pause");
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語言求矩陣運算,急

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

㈨ c語言程序設計 矩陣加法

#include<stdio.h>
voidmain()
{
inta[15][15],i,j,k,t,b;
printf("請輸入一個3行3列世明瞎的矩陣: ");

/*for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("請輸入另一個3行3列的矩陣 ");
for(k=0;k<3;k++)
for(t=0;t<3;t++)
scanf("%d",&a[k][t]);*///<----此處搜空覆蓋掉了矩陣1;

for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
printf("請輸入另一個3行3列的矩陣 ");
for(k=0;k<3;k++)
for(t=0;t<3;t++)
scanf("%d",&a[k+3][t+3]);
printf("矩陣【1】 ");
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",a[i][j]);
printf(" ");
}
printf("矩陣【2】 ");
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d",a[i+3][j+3]);
printf(" ");
}

printf("請選擇要進行的運算:1相加2相乘 ");
scanf("%d",&b);
//<----------樓主此處以下的四個for一一嵌套算出來的結果沒什麼意義。
if(b==1)
{
printf("相加: ");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=a[i][j]+a[i+3][j+3];
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",a[i][j]);
printf(" ");}
}
if(b==2)
{
printf("相乘: ");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i+6][j+6]=a[i][0]*a[3][j+3]+a[i][1]*a[4][j+3]+a[i][2]*a[5][j+3];
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",a[i+6][j+6]);
printf(" ");
}
}
}

復制後可直接編譯運槐肆行,結果如下:格式可自行修改。

㈩ 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日的題,留念。