Efficient Row x Collumn multiplication
1 次查看(过去 30 天)
显示 更早的评论
Hi all,
Consider the vectors: A of size; s x 4 B of size; 4 x s
Now, I am only interested in the product A(i,:)*B(:,i) of size s x 1
for i=1,..,s. I.e. only the row times the collumn with the same index.
The solution I found myself is: diag(A*B);
But I think there must be a faster solution, since I calculate many useless matrix elements if s>>4.
Do you guys have a suggestion?
0 个评论
采纳的回答
更多回答(3 个)
Titus Edelhofer
2012-3-20
Hi,
don't know if it is really more efficient, give it a try:
x = dot(A',B)'
Titus
Daniel Shub
2012-3-20
Maybe I am missing something here, but it seems like you already have a solution ...
x = zeros(s, 1)
for i = 1:s
x(i) = A(i, :)*B(i, :);
end
Daniel Shub
2012-3-20
I am posting this as a separate answer. First when using timing, MATLAB has a hard time timing things that take only 0.000065 seconds, so you should put things in a loop. Second, The size of the matrices need to be established before discounting an answer as too slow.
t=linspace(0,1,1e4);
tf=[t'.^3 t'.^2 t' ones(size(t'))];
M=[-1 3 -3 1; 3 -6 3 0 ; -3 0 3 0; 1 4 1 0]; %Standard form for matrix uniform cubic spline evaluation
P=randn(4,length(t));
tic;
for ii = 1:10
x = diag(tf*M*P);
end;
toc
tic;
for ii = 1:10
x = sum((tf*M)'.*P)';
end;
toc
tic;
for ii = 1:10
x = dot((tf*M)', P)';
end;
toc
tic;
s = length(t);
x = zeros(s, 1);
A = (tf*M);
B = P;
for ii = 1:10
for i = 1:s
x(i) = A(i, :)*B(:, i);
end
end
toc
On my machine I get:
- Elapsed time is 7.584815 seconds.
- Elapsed time is 0.004872 seconds.
- Elapsed time is 0.004445 seconds.
- Elapsed time is 0.149892 seconds.
with the "too slow" loop being an order of magnitude faster than diag. With a large s, there is essentially no difference between the dot and sum method. For your example matrix sizes, the error checking in dot takes a significant portion of the time.
To really optimize your code you want to think about the order in which operations are occurring and memory access.
2 个评论
Daniel Shub
2012-3-20
Because I chose s to be very large (1e4) and I looped 10 times. If s ~4, then the diag method doesn't have that many useless calculations. It is only as s >> 4, that the number of useless calculations dominates.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!