How to calculate A matrix if C1=A*C2*A' ?

1 view (last 30 days)
Ahmad Fakih
Ahmad Fakih on 19 Apr 2019
Edited: Ahmad Fakih on 20 Apr 2019
Dear members,
How to calculate matrix A using matlab if C1 and C2 are known?
Capture.PNG
  6 Comments
David Wilson
David Wilson on 20 Apr 2019
Edited: David Wilson on 20 Apr 2019
Any other conditions, such as symmetry, positive definiteness etc?
Have you looked at the Riccati equation and friends?
Below I've tried a crude numerical minimisation strategy, but it is, as expected, very sensitive.
n = 3; % start small, and then work up to say n=10.
Ax = rand(n,n); % true value
C2 = rand(n,n);
C1 = Ax*C2*Ax';
f = @(A) norm(A*C2*A' - C1)
g = @(a) f(reshape(a,n,n));
optns = optimoptions('fminunc','MaxIterations',1e3,'MaxFunctionEvaluations',1e5)
a0 = randn(n^2,1); % start guess for the elements of [A] in a column.
a = fminunc(g,a0,optns)
A = reshape(a);
I've also tried a symbolic version with just 2*2 and random numbers. I get multiple solutions, so are you sure this problem is well formed, say with a unique solution?
n = 2; % test dimension
syms a11 a12 a21 a22 real
A = [a11, a12; a21 a22];
Ax = [1,2;3,5]; % true solution
C2 = [4,-2;0,6]; % arbitrary constants
C1 = Ax*C2*Ax';
Asoln = solve(A*C2*A'==C1,A) % symbolic toolbox
for i = 1:length(Asoln.a11) % look at each solution & residual
Ar = double([Asoln.a11(i), Asoln.a12(i);
Asoln.a21(i), Asoln.a22(i)]);
res = Ar*C2*Ar' - C1
end
Ahmad Fakih
Ahmad Fakih on 20 Apr 2019
Edited: Ahmad Fakih on 20 Apr 2019
Yeah sorry forgot to tell you the matrices are Symmetrical. @David thanks for the interesting answer. Anyway I found an exact solution, but this requires C2 to be a diagonal ones matrix but that's not a problem for me. Also, cov is basically C1.Thanks all!

Sign in to comment.

Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!