matlab矩阵乘法问题
1.我知道matlab的矩阵乘法怎么写,不是问这个2.matlab老是说不要用for去枚举每一个元素,如果用for-loop写的矩阵乘法要比直接用矩阵A*B要慢很多倍。原...
1. 我知道matlab的矩阵乘法怎么写,不是问这个
2. matlab老是说不要用for去枚举每一个元素,如果用for-loop写的矩阵乘法要比直接用矩阵A*B要慢很多倍。原因是什么?用了什么算法,还是matlab特有的存储结构的,希望高手指点下。
3. 有材料就更好了,发到我邮箱wukefe@163.com 我自己看也没关系。 展开
2. matlab老是说不要用for去枚举每一个元素,如果用for-loop写的矩阵乘法要比直接用矩阵A*B要慢很多倍。原因是什么?用了什么算法,还是matlab特有的存储结构的,希望高手指点下。
3. 有材料就更好了,发到我邮箱wukefe@163.com 我自己看也没关系。 展开
3个回答
展开全部
这主要是因为计算机的工作原理:
MATLAB自带的A*B算法是在汇编级别编辑好的运算,计算机不用做多余的工作,直接对矩阵中的数据进行相乘处理。
计算机处理过程大体是:寻两个矩阵地址-加载乘法函数-运算并将结果写入相应地址-地址位加1-运算并将结果写入相应地址-...-运算并将结果写入相应地址-读取到结束位-结束运算。
而用for-loop自己编写乘法,本身就是调用了for-loop两个函数,这是需要时间的。同时,计算机要重新分配地址记录for函数循环中产生的变量,小点的矩阵还好说,阶数较高、数据较复杂时,计算机会花更多的时间来处理这些和相乘没有直接关系的代码和运算。
计算机处理过程大体是:加载for函数-为变量分配地址-为变量赋值-查询矩阵地址-查询矩阵阶数-判断大小-查询矩阵地址-读取相应数据-加载乘法函数-运算并将结果写入相应地址-为for变量赋值-查询矩阵地址-查询矩阵阶数-判断大小-...-判断大小-结束运算。明显要比A*B多了好多工作,所以会慢很多。
LZ可以做个比较直观的实验:用循环编辑一个较复杂的迭代运算,在其中加入一行显示迭代次数的代码,记录运算时间。再在这行代码后面加上分号,再看看运算时间。你会发现后者时间比前者有明显的缩短。这就是因为计算机占用了一部分时间来处理显示数据的代码。
可以参考一些微机原理、汇编语言等材料会有更深的理解。
MATLAB自带的A*B算法是在汇编级别编辑好的运算,计算机不用做多余的工作,直接对矩阵中的数据进行相乘处理。
计算机处理过程大体是:寻两个矩阵地址-加载乘法函数-运算并将结果写入相应地址-地址位加1-运算并将结果写入相应地址-...-运算并将结果写入相应地址-读取到结束位-结束运算。
而用for-loop自己编写乘法,本身就是调用了for-loop两个函数,这是需要时间的。同时,计算机要重新分配地址记录for函数循环中产生的变量,小点的矩阵还好说,阶数较高、数据较复杂时,计算机会花更多的时间来处理这些和相乘没有直接关系的代码和运算。
计算机处理过程大体是:加载for函数-为变量分配地址-为变量赋值-查询矩阵地址-查询矩阵阶数-判断大小-查询矩阵地址-读取相应数据-加载乘法函数-运算并将结果写入相应地址-为for变量赋值-查询矩阵地址-查询矩阵阶数-判断大小-...-判断大小-结束运算。明显要比A*B多了好多工作,所以会慢很多。
LZ可以做个比较直观的实验:用循环编辑一个较复杂的迭代运算,在其中加入一行显示迭代次数的代码,记录运算时间。再在这行代码后面加上分号,再看看运算时间。你会发现后者时间比前者有明显的缩短。这就是因为计算机占用了一部分时间来处理显示数据的代码。
可以参考一些微机原理、汇编语言等材料会有更深的理解。
展开全部
用for-loop编程写的程序,每一个元素都要循环一遍,进行运算。而用矩阵乘法则相当于直接代入替换。例如:求一个函数在多个点处的函数值,用循环就要算好多次。而用subs(f,old,new)就相当于直接替换,所以计算会很快。效率相当高。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个就要根据你的需求了,matlab中矩阵相乘有两种,一种是点乘,即a.*b,还有一种是直接乘,即a*b。点乘是两个矩阵之间对应坐标之间的元素相乘,而直接乘,就是按照矩阵乘法的法则里计算的。
给出源代码如下:
>>
syms
x
y
>>
a=[cos(x)
0
sin(x);0
1
0;-sin(x)
0
cos(x)];
>>
b=[cos(y)
sin(y)
0;-sin(y)
cos(y)
0;0
0
1];
>>
c1=a.*b;
>>
c2=a*b;
>>
c1
c1
=
[cos(y)
cos(x)
0
0
]
[
]
[
0
cos(y)
0
]
[
]
[
0
0
cos(x)]
>>
c2
c2
=
[cos(y)
cos(x)
cos(x)
sin(y)
sin(x)]
[
]
[
-sin(y)
cos(y)
0
]
[
]
[-sin(x)
cos(y)
-sin(x)
sin(y)
cos(x)]
给出源代码如下:
>>
syms
x
y
>>
a=[cos(x)
0
sin(x);0
1
0;-sin(x)
0
cos(x)];
>>
b=[cos(y)
sin(y)
0;-sin(y)
cos(y)
0;0
0
1];
>>
c1=a.*b;
>>
c2=a*b;
>>
c1
c1
=
[cos(y)
cos(x)
0
0
]
[
]
[
0
cos(y)
0
]
[
]
[
0
0
cos(x)]
>>
c2
c2
=
[cos(y)
cos(x)
cos(x)
sin(y)
sin(x)]
[
]
[
-sin(y)
cos(y)
0
]
[
]
[-sin(x)
cos(y)
-sin(x)
sin(y)
cos(x)]
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询