How to invert 3D matrices?

23 visualizzazioni (ultimi 30 giorni)
gsourop
gsourop il 15 Dic 2016
Modificato: James Tursa il 15 Lug 2021
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 Commento
Walter Roberson
Walter Roberson il 15 Dic 2016
(A'A) is not defined for 3 dimensional A.

Accedi per commentare.

Risposta accettata

James Tursa
James Tursa il 15 Dic 2016
Modificato: James Tursa il 15 Lug 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:
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.

Più risposte (1)

KSSV
KSSV il 15 Dic 2016
A=rand(3,2,5);
B=zeros(3,3,5);
for i = 1:5
B(:,:,i)=inv(A(:,:,i)*A(:,:,i)');
end

Community Treasure Hunt

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

Start Hunting!

Translated by