MATLAB中的矩阵乘法与实际矩阵乘法的差异

        今天在做算法实现时,想用将算法矩阵化,这样子可以并行运算,虽然更耗内存,但起码效率会更好。为了验证矩阵化过程是否正确,我将矩阵化后所得结果和原来的串行计算结果相减,看看两者的之差的范数是否等于0。但我发现两者一直有个微小的差异,本着刨根问底的精神,于是仔细探究了一下,发现差异出现在其中的矩阵乘法,也就是说MATLAB里两个矩阵相乘与实际矩阵相乘的过程有差异。可以运行如下程序体会这种差异:

%verify_matrix_multiplication
clc;clear;close all;
M = 100;
N = 50;
A = rand(M,N);
B = rand(N,M);

AxB_1 = A*B;%mtimes(A,B)

AxB_2 = zeros(M,M);
for ii=1:M
    for jj=1:M
        AxB_2(ii,jj)=A(ii,:)*B(:,jj);
    end
end

norm(AxB_1-AxB_2)

这段代码就是随机生成两个矩阵A和B,其中AxB_1对应于利用MATLAB内置的乘法得到矩阵相乘结果,而AxB_2对应于使用串行方式得到矩阵相乘结果(即AxB_2第(ii,jj)个元素等于矩阵A的第ii行乘以矩阵B的第jj列,也就是严格按矩阵定义计算矩阵乘法)。

        运行以上程序可以发现,最后的norm(AxB_1-AxB_2)结果一直有个微小的差异。

        矩阵乘法对应于内置的mtimes函数,这个可以用"help *"得知:

        用“edit mtimes”打开mtimes函数,发现只有如下一段注释:

%*   Matrix multiply.
%   X*Y is the matrix product of X and Y.  Any scalar (a 1-by-1 matrix)
%   may multiply anything.  Otherwise, the number of columns of X must
%   equal the number of rows of Y.
%
%   C = MTIMES(A,B) is called for the syntax 'A * B' when A or B is an
%   object.
%
%   See also TIMES.

%   Copyright 1984-2005 The MathWorks, Inc.

因此,可以猜想,MATLAB应该是用某种等价方法更高效地实现矩阵乘法,等价实现过程中可能由于有限字长效应导致与实际的矩阵乘法结果有微小的差别。另外,我在octave中也试着运行了上面的程序,发现结果严格等于零~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值