倍频程/Matlab:Frobenius内积的有效计算?
我有两个矩阵A和B,我想得到的是:倍频程/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 运行时间
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-一个更好的解决方案使用向量积。请参阅以及运行时。