How to eliminate for loop and perform the computation parallely?
4 次查看(过去 30 天)
显示 更早的评论
Hi, I am looking a way to reduce the time for computation of the problem of this size. This code is a larger part of a big code where this code is ran several 100 times.
The data will be as large as shown in the code. I am looking a way to eliminate the loop and perform complete problem in a sigle go, to make this step fast. Could some one propose a solution without disturbing the fomulation through matrix multiplication istead of loop?
clear all;
close all;
fs = 35000;
T = 100; % s
Nt = fs*T;
M = 60;
a1 = randn(M,Nt);
a2 = randn(M,Nt);
lambda = randn(1,Nt);
B = randn(M,Nt);
result = zeros(2,Nt);
tic
est = zeros(M,Nt);
for i= 1:Nt
A = [a1(:,1) a2(:,1)];
result(:,i) = (A'*A + lambda(1,i)*[0 1;0 1])\(A'*B(:,i));
est(:,i) = a1(:,i)*result(1,i)+a2(:,i)*result(2,i);
end
toc
0 个评论
采纳的回答
chicken vector
2023-4-19
编辑:chicken vector
2023-4-19
%% Data:
fs = 35000;
T = 100;
Nt = fs*T;
M = 60;
a1 = randn(M,Nt);
a2 = randn(M,Nt);
lambda = randn(1,Nt);
B = randn(M,Nt);
result = zeros(2,Nt);
est = zeros(M,Nt);
A = [a1(:,1) a2(:,1)];
%% Vectorised method:
tic
num = (repmat(A'*A, 1, 1, Nt) + repmat(reshape([zeros(size(lambda)); lambda], 1, 2, []), 2, 1)); % \ (A' * B)
dem = reshape((A' * B), 2, 1, []);
resultVectorised = reshape(pagemldivide(num,dem), 2, []);
estVectorised = a1 .* result2(1,:) + a2 .* result2(2,:);
timeVectorised = toc;
%% Loop method:
tic
for i = 1 : Nt
result(:,i) = (A'*A + lambda(1,i) * [0 1 ; 0 1]) \ (A' * B(:,i));
est(:,i) = a1(:,i) * result(1,i) + a2(:,i) * result(2, i);
end
timeLoop = toc;
%% Output:
fprintf('Vectorisation: %.3f s\n', timeVectorised)
fprintf('Loop: %.3f s\n', timeLoop)
fprintf('Improvement: %.3f\n', timeLoop / timeVectorised)
fprintf('Absolute error: %e\n', max(max(abs(est - estVectorised))))
Vectorisation: 1.080 s
Loop: 20.117 s
Improvement: 18.632
Absolute error: 1.776357e-15
I think the vectorised method can be improved since, personally, I found hard to implement it without precisely know what I am doing.
Moreover, I think the small numerical error occurs due to pagemldivide which might use a different method from \, but I am not sure.
4 个评论
chicken vector
2023-4-21
编辑:chicken vector
2023-4-21
Sorry but I am not understand what you're asking.
The loop is the same as before, is the vectorised method that is changed.
Can you articulate?
更多回答(0 个)
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!