How to simplify the for loop for 3D matrix?

I have the following code, where I am looking to eliminate only the outer for-loop (k) and include 'k' inside the inner loop. Here, I perform inverse considering each calculation point (k=1:NFocP) in a loop, but would like to some how eliminate outer loop and perform the inverse for all points at one instance. And the other concern is that I don't want to disturb the mldivide (\) function. Is there any way to solve this issue?
clear all;
load A.mat
load s1.mat
load s2.mat
Foc = size(s1,3); % no of calculation points
Nt = size(s1,2); % length of signal
M = size(s1,1); % no of rsensors
for k=1:Foc
for p = 1:Nt
H = [s1(:,p,k) s2(:,p,k)];
tmp = H\ A(:,p);
Ainv1(k,p) = tmp(1);
Ainv2(k,p) = tmp(2);
end
end

2 Comments

That would require calculating an inverse of a 3D matrix for H which is not possible. You may be able to use foreach to speed up the code by doing the outer loops in parallel.
Attached H and A1
The matrix H looks like 9 x 2 x 14 and matrix A1 is 9 x1. I need to perform inversion between every page of H with A1 using mldivide so that output looks like 2 x 1 x14 matrix. No loops. Is this possible?
clear all;
close all;
load H.mat
load A1.mat

Sign in to comment.

 Accepted Answer

load('A.mat');
load('s1.mat');
load('s2.mat');
[m,n,p] = size(s1);
% s = [reshape(s1, [m,1,n,p]), reshape(s2, [m,1,n,p])];
% Ar = reshape(A,m,1,[]);
% C=pagemldivide(s,Ar);
% Ainv1=reshape(C(1,:,:),n,p).';
% Ainv2=reshape(C(2,:,:),n,p).';
s = reshape([s1;s2], [m,2,n,p]);
Ainv1 = zeros(p,n);
Ainv2 = zeros(p,n);
for i=1:n
C=pagemldivide(s(:,:,i,:),A(:,i));
Ainv1(:,i)=C(1,:);
Ainv2(:,i)=C(2,:);
end

4 Comments

Thanks Bruno, my matlab says 'Unrecognized function or variable 'pagemldivide'.' May I know if I need to install specific tool box for pagemldivide function.
Ok, I see now. I have 2021. Is there any possibility to replace pagemldivide with any other alternate functions to do same task?
You might try this that requires the FEX
https://fr.mathworks.com/matlabcentral/fileexchange/27762-small-size-linear-solver#functions_tab
[m,n,p] = size(s1);
s = reshape([s1;s2], [m,2,n,p]);
Ainv1 = zeros(p,n);
Ainv2 = zeros(p,n);
Ar = reshape(A,m,1,[]);
scs = pagemtimes(s,'ctranspose',s,'none');
scA = pagemtimes(s,'ctranspose',Ar,'none');
for i=1:n
scsi = reshape(scs(:,:,i,:),2,2,[]);
scAi = reshape(scA(:,:,i,:),2,1,[]);
C = inv2(scsi, scAi); % https://fr.mathworks.com/matlabcentral/fileexchange/27762-small-size-linear-solver#functions_tab
Ainv1(:,i)=C(1,:);
Ainv2(:,i)=C(2,:);
end

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!