倍频程/Matlab:Frobenius内积的有效计算?

倍频程/Matlab:Frobenius内积的有效计算?,matlab,matrix,octave,Matlab,Matrix,Octave,我有两个矩阵A和B,我想得到的是: trace(A*B) 如果我没弄错的话,这个叫做 我关心的是效率。我只是担心这种直截了当的方法将首先进行整个乘法(我的矩阵是数千行/列),然后才进行乘积的跟踪,而我真正需要的操作要简单得多。是否有一个函数或语法可以有效地执行此操作?正确…对元素相关产品求和会更快: n = 1000 A = randn(n); B = randn(n); tic sum(sum(A .* B)); toc tic sum(diag(A * B')); toc 运行时间

我有两个矩阵A和B,我想得到的是:

trace(A*B)
如果我没弄错的话,这个叫做


我关心的是效率。我只是担心这种直截了当的方法将首先进行整个乘法(我的矩阵是数千行/列),然后才进行乘积的跟踪,而我真正需要的操作要简单得多。是否有一个函数或语法可以有效地执行此操作?

正确…对元素相关产品求和会更快:

n = 1000

A = randn(n);
B = randn(n);

tic
sum(sum(A .* B));
toc

tic
sum(diag(A * B'));
toc
运行时间为0.010015秒。
运行时间为0.130514秒。

sum(sum(A.*B))
避免执行完整的矩阵乘法

使用向量乘法怎么样

(A(:)')*B(:)

运行时检查 将四个选项与尺寸为1000×1000的
A
B
进行比较:
1.向量内积:
A(:)'*B(:)
(这个答案)只花了0.0011秒

2.使用元素乘法
sum(sum(A.*B))
(“的答案”)需要
0.0035秒

3.跟踪
跟踪(A*B')
(由OP提出)耗时
0.054秒

4.对角线之和
Sum(diag(A*B'))
(选项被拒绝)花费
0.055秒

带回家的信息:当涉及到矩阵/向量积时,Matlab非常有效。使用向量内积比高效的元素乘法解快3倍


基准代码 用于提供运行时检查的代码

t=zeros(1,4);
n=1000; % size of matrices
it=100; % average results over XX trails
for ii=1:it, 
    % random inputs
    A=rand(n);
    B=rand(n); 
    % John's rejected solution
    tic; 
    n1=sum(diag(A*B'));
    t(1)=t(1)+toc;
    % element-wise solution
    tic;
    n2=sum(sum(A.*B));
    t(2)=t(2)+toc;
    % MOST efficient solution - using vector product
    tic;
    n3=A(:)'*B(:);
    t(3)=t(3)+toc;
    % using trace
    tic;
    n4=trace(A*B');
    t(4)=t(4)+toc;
    % make sure everything is correct
    assert(abs(n1-n2)<1e-8 && abs(n3-n4)<1e-8 && abs(n1-n4)<1e-8);
end;
t./it
t=0(1,4);
n=1000;%矩阵的大小
它=100;%超过XX次试验的平均结果
对于ii=1:it,
%随机输入
A=兰特(n);
B=兰特(n);
%约翰拒绝的解决方案
抽搐;
n1=总和(对角线(A*B');
t(1)=t(1)+toc;
%元素解
抽搐;
n2=总和(总和(A.*B));
t(2)=t(2)+toc;
%最有效的解决方案-使用向量积
抽搐;
n3=A(:)'*B(:);
t(3)=t(3)+toc;
%使用跟踪
抽搐;
n4=记录道(A*B');
t(4)=t(4)+toc;
%确保一切都是正确的

assert(abs(n1-n2)@izhak-一个更好的解决方案使用向量积。请参阅以及运行时。