matlab 计算两个矩阵相乘

matlab 计算两个矩阵相乘,第1张

表示矩阵与矩阵相乘,满足线性代数上学的矩阵与矩阵的乘法,表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。

例如:AB,那么A是m行n列的话,B必须也是m行n列。其他的如: “/ 与 / ” ,“^ 与 ^ ”的含义都是一样的。

题目中源代码如下:

>> A=[1 3 05 1 2; 1/3 1 1/2 1/2 1/2 ; 2 2 1 4 3;1 2 1/4 1 5; 1/2 2 1/3 1/5 1]

>> w=[02069 0069 04138 02069 01034]

>> C1=Aw

C1为矩阵A和w相乘的结果。由于两个矩阵维数不同,结果提醒出错。

扩展资料:

两个矩阵相乘一些注意事项:

1、如果矩阵A的列数等于矩阵B的行数,那么矩阵相乘,即C=AB,就被定义为二维矩阵。

2、如果不是这个情况,MATLAB就返回一个错误信息。只有一个例外就是这两个矩阵之一是1x1,如一个标量,那么MATLAB是可以接受的、在MATLAB中,乘法的运算符是。

3、因此,命令是C=AB。在矩阵乘法运算中AB与BA是不同的(线性代数知识),若只是矩阵A、B对应元素相乘,则是AB(乘号前面加个点)。

#include<iostreamh>

#include<stdlibh>

#include<iomaniph>

void caidan();

#define max 12500

typedef struct{

int e;

int i; //行下标

int j; //列下标

}triple;

typedef struct{

triple data[max+1];

int rpos[10];

int m,n,t;

}ts;

//矩阵的转置实现函数

void fasttransposesmatrix(ts M,ts &T)

{

int col,num[10],cpot[10]={0},p,q;

Tm=Mn;

Tn=Mm;

Tt=Mt;

if(Tt){

for(col=1;col<=Mn;++col)

num[col]=0;

for(int t1=1;t1<=Mt;++t1)

++num[Mdata[t1]j];

cpot[1]=1;

for(col=2;col<=Mn;++col)

cpot[col]=cpot[col-1]+num[col-1];

for(p=1;p<=Mt;++p){

col=Mdata[p]j;

q=cpot[col];

Tdata[q]i=Mdata[p]j;

Tdata[q]j=Mdata[p]i;

Tdata[q]e=Mdata[p]e;

++cpot[col];

}

}

}

//矩阵的乘法Y=MQ实现函数

void multsmatrix(ts M,ts Q,ts &Y){

int arow,brow=0,p,q,i1,tp,t1,ctemp[10],ccol;

if(Mn!=Qm)

cout<<"错误!"<<endl;

Ym=Mm;

Yn=Qn;

Yt=0;

if(MtQt!=0)

{

for(arow=1;arow<=Mm;++arow)

{

for(i1=1;i1<=Mm;i1++)

ctemp[i1]=0;

Yrpos[arow]=Yt+1;

if(arow<Mm)

tp=Mrpos[arow+1];

else

tp=Mt+1;

for(p=Mrpos[arow];p<tp;++p)

{

brow=Mdata[p]j;

if(brow<Qm)

t1=Qrpos[brow+1];

else

t1=Qt+1;

for(q=Qrpos[brow];q<t1;++q)

{

ccol=Qdata[q]j;

ctemp[ccol]+=Mdata[p]eQdata[q]e;

}

}

for(ccol=1;ccol<=Yn;++ccol)

if(ctemp[ccol]){

++Yt;

if(++Yt>max)

cout<<"错误"<<endl;

Ydata[Yt]i=arow;

Ydata[Yt]j=ccol;

Ydata[Yt]e=ctemp[ccol];

cout<<Ydata[Yt]i<<Ydata[Yt]j<<Ydata[Yt]e<<endl;

}

}

}

}

//将数组转换成三元组

void exchange1(int a,ts &M,int m,int n)

{

int i1,j1,z=1,pos[10];

for(i1=0;i1<=n;i1++)

{

pos[i1]=0;

Mrpos[i1]=0;

}

pos[0]=1;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

if(a[i1][j1])

{

Mdata[z]i=i1+1;

Mdata[z]j=j1+1;

Mdata[z]e=a[i1][j1];

z++;

pos[i1+1]++;

}

for(i1=0;i1<=m;i1++)

{

Mrpos[i1+1]=Mrpos[i1]+pos[i1];

}

Mt=z-1;

Mm=m;

Mn=n;

}

//将三元组转换成数组形式

void exchange2(int a,ts &T)

{

int i1,j1,z1;

for(i1=0;i1<Tm;i1++)

for(j1=0;j1<Tn;j1++)

{

a[i1][j1]=0;

}

for(z1=1;z1<=Tt;z1++)

for(i1=0;i1<Tm;i1++)

for(j1=0;j1<Tn;j1++)

if((i1==Tdata[z1]i-1)&&(j1==Tdata[z1]j-1))

{

a[i1][j1]=Tdata[z1]e;

}

}

//输出结果

void output(int a,int m,int n)

{

int i1,j1;

for(i1=0;i1<m;i1++)

{

for(j1=0;j1<n;j1++)

{

cout<<a[i1][j1]<<',';

}cout<<endl;

}

}

//转置的 *** 作函数

void zhuanzhi(){

int i1,j1,m,n;

cout<<"初始矩阵:"<<endl;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intpp=new int[m];

for(i1=0;i1<m;i1++)

pp[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>pp[i1][j1];

}

cout<<endl;

ts M,T;

exchange1(pp,M,m,n);

fasttransposesmatrix(M,T);

intpp1=new int[Tm];

for(i1=0;i1<Tm;i1++)

pp1[i1]=new int[Tn];

exchange2(pp1,T);

cout<<"转置后的矩阵是:"<<endl;

output(pp1,Tm,Tn);

delete pp;

delete pp1;

caidan();

}

//相乘的 *** 作函数

void xiangcheng(){

ts M,Q,Y;

int i1,j1,m,n;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intp=new int[m];

for(i1=0;i1<m;i1++)

p[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>p[i1][j1];

}

cout<<endl;

exchange1(p,M,m,n);

cout<<"请再次输入一个矩阵(即乘数):"<<endl;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intp2=new int[m];

for(i1=0;i1<m;i1++)

p2[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>p2[i1][j1];

}

cout<<endl;

exchange1(p2,Q,m,n);

multsmatrix(M,Q,Y);

intp1=new int[Ym];

for(i1=0;i1<Ym;i1++)

p1[i1]=new int[Yn];

exchange2(p1,Y);

cout<<"两矩阵相乘结果为:"<<endl;

output(p1,Ym,Yn);

delete p2;

delete p1;

caidan();

}

//菜单

void caidan()

{

int i;

cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;

cout<<" 1矩阵的转置 2两个矩阵的乘法 3退出 "<<endl;

cout<<"请选择:"<<endl;

cin>>i;

switch(i){

case 1:zhuanzhi();

break;

case 2:xiangcheng();

break;

case 3: exit(0);

}

}

//主函数

void main()

{

caidan();

}

#include<stdioh>

int p,q,k;

void main(){

float A[2][2]={1,1,2,1},B[2][1]={2,1};

float C[2][1]={0};

printf("矩阵A矩阵B为:\n"); //计算两个矩阵相乘;以[2][2][2][1]为例

for(p=0;p<2;++p)

首先要对编程有个比较大概的了解,编程的对象,编程的原理,编程的目的等等。推荐阅读《计算机科学导论》,该书简单明了的讲述了计算机组成、计算机网络、 *** 作系统、程序设计、数据结构等编程均会用到的基本知识。

在了解编程基本知识后,要想想自己学习编程后到底要干什么以确定学习的方向。比如说是想要开发手机app,网站开发,企业系统等等。当然,在初期没有指导的情况下,我们会迷茫,无法找寻自己的方向。那么就选择当前应用最广泛,最容易找到工作的一门语言来学习。如Java/C++/Python/Net/PHP,他们应用极其广泛,找工作也非常容易。

1、矩阵相乘需要前面矩阵的行数与后面矩阵的列数相同方可相乘。第一步先将前面矩阵的每一行分别与后面矩阵的列相乘作为结果矩阵的行列。第二步算出结果即可。

2、矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。

#include "stdioh"

main()

{

int i,j,k,a[3][3],b[3][3],c[3][3];

for(i=0;i<3;i++)

for(j=0;j<3;j++)

scanf("%d",a[i][j]); //shu lu a[][]

for(i=0;i<3;i++)

for(j=0;j<3;j++)

scanf("%d",b[i][j]); //shu lu b[][]

for(i=0;i<3;i++)

for(j=0;j<3;j++)

for(k=0;k<3;k++)

c[i][j]=a[i][k]b[k][j];//ji suang c[][]

for(i=0;i<3;i++)

for(j=0;j<3;j++)

printf("%d",a[i][j]);//shu chu a[][]

for(i=0;i<3;i++)

for(j=0;j<3;j++)

printf("%d",b[i][j]);]);//shu chu b[][]

for(i=0;i<3;i++)

for(j=0;j<3;j++)

printf("%d",c[i][j]);]);//shu chu c[][]

}

#include "stdioh"

#include "stdlibh"

void main ()

{

int m,l,p,q;

printf("输入第一个矩阵的维数m和l:\n");

scanf("%d%d",&m,&l);

printf("输入第二个矩阵的维数p和q:\n");

scanf("%d%d",&p,&q);

while (l!=p)

{

printf("两个矩阵不匹配,不能进行相乘运算,请重新输入\n\n");

printf("输入第一个矩阵的维数m和l:\n");

scanf("%d%d",&m,&l);

printf("输入第二个矩阵的维数p和q:\n");

scanf("%d%d",&p,&q);

}

double a[200][200]={0}, b[200][200]={0},sum=0;

int i,j,k=0;

for (i=0;i<m;i++)

{

for (j=0;j<l;j++)

{

a[i][j]=(double)rand()/RAND_MAX;

}

}

printf("随机矩阵a是:\n");

for (i=0;i<m;i++)

{

for (j=0;j<l;j++)

{

printf("%f ",a[i][j]);

}

printf("\n");

}

//cout<<"输入一个32的矩阵:"<<endl;

for (i=0;i<p;i++)

{

for (j=0;j<q;j++)

{

b[i][j]=(double)rand()/RAND_MAX;

}

}

printf("随机矩阵b是:\n");

for (i=0;i<p;i++)

{

for (j=0;j<q;j++)

{

printf("%f ",b[i][j]);

}

printf("\n");

}

printf("ab相乘结果为:\n");

for (i=0;i<m;i++)

{

while (k<q)

{

for (j=0;j<q;j++)

{

sum = a[i][j]b[j][k]+sum;

}

printf("%f ",sum);

k++;

sum=0;

}

k=0;

printf("\n");

}

}

如果不满足你要求,自己再改一下吧

如果矩阵a与矩阵b相乘必须:

a中的列数必须b中行数。

如果不相同,则ab无意义;

注意:

不要求a的行数与b的列数是否相等。

ab中的第i行j

列的元素要等于a中的i

行元素与b中的j列元素对应元素相乘再相加。

(即a中i行的第一个元素与b中j列的第一个元素相乘再加上i行的第二个元素与b中j列的第二个元素相乘,一直加到a中i行的最后一个元素与b中j列的最后一个元素相乘)

以上就是关于matlab 计算两个矩阵相乘全部的内容,包括:matlab 计算两个矩阵相乘、C语言:编写完整程序:计算两个矩阵的乘积。、两个二维数组行相乘的c语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9448283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存