当前位置:首页 » 编程语言 » 用c语言编程矩阵的和差积
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言编程矩阵的和差积

发布时间: 2022-06-19 01:34:03

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