A. 用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;
}
B. C語言編程求矩陣乘積
#defineMAX50
#defineMMAX
#defineNMAX
#defineTMAX
#defineSMAX
intMult(doublea[][N],intm,intn,doubleb[][T]ints,intt,doublec[][T]){
inti,j,k;
if(n!=s){
printf("兩矩陣相乘,左矩陣的列數與右矩陣的行數必須相等。 ");
return0;
}
intc;
tmp.m_Mat=newdouble*[tmp.m_Rows];
for(inti=0;i<tmp.m_Rows;i++)tmp.m_Mat[i]=newdouble[tmp.m_Cols];
for(i=0;i<m;++i){
for(j=0;j<n;++j){
c[i][j]=0;
for(k=0;k<t;++k)
c[i][j]+=c[i][k]*c[k][j];
}
}
return1;
}
C. 如何用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];
D. 求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");
}
}
E. 急 急 急 !!!!!c語言
大哥,你乾脆說做一個課程設計得了。
程序可以幫幫你,體會心得應該自己寫嘛,對於難點,你不會的就是難點嘛。
50太少了
100我就做嘿嘿
F. C語言計算矩陣積和式
想算多少階都是可以的,但是矩陣積和式是np不可解問題,在二項式時間里不能保證算出來,就是說,要是有很長的時間可以算,那麼多少階都是可以的 ,但是現有的硬體水平,再怎麼改進也是差不多的。
源代碼隨後奉上
G. 怎樣用C語言去編程兩個3*3矩陣的和,差,際
和差比較簡單,但是做乘積就比較困難了,要有好的演算法
H. C語言編程:編寫一個函數求兩個矩陣的差
intfunction(double**p,intp_r,intp_c,double**q,intq_r,intq_c,double**re){
inti,j;
if(p==NULL||q==NULL||p_r!=q_r||p_c!=q_c){
re=NULL;
return1;
}
if(p_r*p_c>1024){
re=NULL;
return2;
}
for(i=0;i<p_r;++i)
for(j=0;j<p_c;++j)
re[i][j]=p[i][j]-q[i][j];
return0;
}
I. C語言 用類編程實現兩個矩陣的和、差、積,N×N,N可變 急!!!在線等
//原來寫著玩兒的。還多一個求冪功能,我在devcpp 4.9.9.2 下編譯運行通過測試。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <vector>
#include <windows.h>
using namespace std ;
const int maxR = 100 , maxC = 100 ;
typedef double mat_element ;
struct Matr{ //Matrix
int n , m ; //number of row / col
mat_element e[maxR][maxC] ;
Matr (int _n = 1 , int _m = 1): n(_n) , m(_m) {} ;
Matr operator + (const Matr A) const{
assert(n == A.n && m == A.m) ;
Matr M(n , m) ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < m ; j++) {
M.e[i][j] = e[i][j] + A.e[i][j] ;
}
}
return M ;
}
Matr operator - (const Matr A) const{
assert(n == A.n && m == A.m) ;
Matr M(n , m) ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < m ; j++) {
M.e[i][j] = e[i][j] - A.e[i][j] ;
}
}
return M ;
}
Matr operator * (const Matr A) const{
assert(m == A.n) ;
Matr M(n , A.m) ;
memset(M.e , 0 , sizeof(M.e) ) ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < A.m ; j ++) {
for(int k = 0 ; k < m ; k++) {
M.e[i][j] += e[i][k] * A.e[k][j] ;
}
}
}
return M ;
}
Matr operator * (const mat_element k) const{
Matr M(n , m) ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < m ; j++) {
M.e[i][j] = e[i][j] * k ;
}
}
return M ;
}
Matr operator ^ (const int k) const{
assert(n == m) ;
Matr M(n , m) , A = *this ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
M.e[i][j] = (i == j) ;
}
}
for(int i = 1 ; i > 0 ; i <<= 1){
if(k & i) M = M * A ;
A = A * A ;
}
return M ;
}
void input() {
cout << "please input a " << n << "*" << m << " matrix" << endl ;
mat_element tmp ;
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < m ; j++) {
cin >> tmp ;
e[i][j] = tmp ;
}
}
cout << "matrix inputed !" << endl ;
}
void output(){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < m ; j++) {
cout << e[i][j] << '\t' ;
}
printf("\n") ;
}
printf("\n") ;
}
} ;
int main(){
Matr A(2 , 2) , B(2 , 2) ;
/*
A.e[0][0] = 1 ;
A.e[0][1] = 2 ;
A.e[1][0] = 4 ;
A.e[1][1] = 8 ;
B.e[0][0] = 16 ;
B.e[0][1] = 32 ;
B.e[1][0] = 64 ;
B.e[1][1] = 128 ;
*/
A.input() ;
B.input() ;
(A + B).output() ;
(A - B).output() ;
(A * B).output() ;
(A * 2).output() ;
system("pause") ;
return 0 ;
}
J. 怎樣用C語言去編程兩個3*3矩陣之和,之差,之積
/****************************************************************************/
/*題目:矩陣加減乘演示*****/
/*作者:vc99 writed for c bar***/
/*日期:***/
/*簡介:本演示引入第三個矩陣來保存運算結果,以達到連續運算的目的。***/
/***************************************************************************/
# include <stdio.h>
# define X 3
# define Y 3
/**********輸出數組*******/
void prt(int a[X][Y])
{
int i,j;
for(i=0;i<X;i++)
{
for(j=0;j<Y;j++)
printf(" %5d",a[i][j]);
printf("\n");
}
}
/************輸入數組*********/
void inp(int a[X][Y])
{
int i,j,t;
for(i=0;i<Y;i++)
for(j=0;j<Y;j++)
{
printf("a[%d][%d]=",i,j);/**提示輸入第幾個矩陣元素 ****/
scanf("%d",&t);
a[i][j]=t;
}
}
/********矩陣加,結果保存於c[][]*********/
void madd(int a[X][Y],int b[X][Y],int m[X][Y])
{
int i,j;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
m[i][j]=a[i][j]+b[i][j];/***矩陣加****/
prt(m);
}
/********矩陣減,結果保存於c[][]****/
void msub(int a[X][Y],int b[X][Y],int m[X][Y])
{
int i,j;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
m[i][j]=a[i][j]-b[i][j];/***矩陣減****/
prt(m);
}
/*******矩陣乘,結果保存於c[][]******/
void mmul(int a[X][Y],int b[X][Y],int m[X][Y])
{
int i,j,k;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
m[i][j]=0;
for(i=0;i<X;i++)
for(j=0;j<Y;j++)
for(k=0;k<Y;k++)
m[i][j]+=a[i][k]*b[k][j];/***矩陣乘****/
prt(m);
}
int main()
{
int sel=0,agn=1,cpt=1;
int a[X][Y], b[X][Y], m[X][Y];
while(agn==1)
{
printf("請輸入矩陣a!\n");
inp(a);
printf("請輸入矩陣b!\n");
inp(b);
while (cpt==1)
{
printf("請選擇矩陣運算:[1]+ [2]- [3]*\n\t");
scanf("%d",&sel);
if (sel==1) madd(a,b,m);
if (sel==2) msub(a,b,m);
if (sel==3) mmul(a,b,m);
printf("重新運算?[1]是 [0]否");
scanf("%d",&cpt);
}
printf("是否重新輸入矩陣?[1]是 [0]否");
scanf("%d",&agn);
}
return 0;
}
參考資料:http://..com/question/43640208.html?si=1