How to invert 3D matrices?
20 views (last 30 days)
Show older comments
Hi everyone,
I have a 3D matrix so A with dimensions 3x2x5 and I need to invert the following folmula inv(A'A). I need to transpose transpose(A(1,:,:), then transpose(A(2,:,:) and transpose(A(3,:,:) In case a inv(A) I can use the MultiSolver function in http://uk.mathworks.com/matlabcentral/fileexchange/24260-multiple-same-size-linear-solver, but how can I invert the product a transposed 3D matrix A with A? I have tried
inv_X_f=permute(MultiSolver(permute(X_f,[1 3 2]).*X_f,eye(3)),[1 2 3]);
Thanks in advance.
1 Comment
Accepted Answer
James Tursa
on 15 Dec 2016
Edited: James Tursa
on 15 Jul 2021
Step 1)
Get your 2D matrix pages into the 1st two dimensions. This makes each 2D page contiguous in memory and is somewhat of an unwritten standard for many other functions that operate on 2D pages. So:
Ap = permute(A,[2 3 1]);
Step 2)
Do the page multiplies with Ap using one of the following utilities. Note that some of these utilities require building a mex routine and thus need a C compiler installed. For methods that require the 2D transposes to be explicitly formed first, you could just use another permute. E.g.,
ApT = permute(A,[3 2 1]);
MULTIPROD:
MMX:
MTIMESX:
PAGEMTIMES:
https://www.mathworks.com/help/matlab/ref/pagemtimes.html?searchHighlight=pagemtimes&s_tid=srchtitle
Step 3)
Now you are ready to use Multisolver:
Long term, I would advise that you always have your 2D pages in the 1st two dimensions in all of your code. This avoids the necessity of doing all of those permutes which require the entire data set to be copied in memory.
0 Comments
More Answers (1)
KSSV
on 15 Dec 2016
A=rand(3,2,5);
B=zeros(3,3,5);
for i = 1:5
B(:,:,i)=inv(A(:,:,i)*A(:,:,i)');
end
0 Comments
See Also
Categories
Find more on Characters and Strings in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!