找到一种算法来快速求逆符号变量的大矩阵

问题描述

我必须解决包含大量符号变量的 2 个 12x12 矩阵之间的等式,并使用它们执行矩阵求逆。只有一个未知名称为“SIGMA_O”。

当我以 2 个 2x2 矩阵为例时,我的系统很快就得到了解决,反演非常直接。

现在,对于 2 个 12x12 矩阵的情况,我需要在实际反转符号变量的 31x31 矩阵之前(我在之后边缘化),因为反转需要很多时间。

我想从我的 GPU NVIDIA QUADRO RTX 6000 中受益,以更快地实现这种反转,但目前不支持符号阵列的 GPU 优化。

在您将找到反转行的脚本下方:

COV_ALL = inv(FISH_SYM)

和整个代码

clear;
clc;
format long;
% 2 Fisher Matrixes symbolic : FISH_GCsp_SYM,: 1 cosmo params + 1 bias spectro put for common
%                              FISH_XC_SYM : 1 cosmo params + 2 bias photo correlated
% GCsp Fisher : 7 param cosmo and 5 bias spectro which will be summed
FISH_GCsp_SYM = sym('sp_',[17,17],'positive');
% Force symmetry for GCsp
FISH_GCsp_SYM = tril(FISH_GCsp_SYM.') + triu(FISH_GCsp_SYM,1)
% GCph Fisher : 7 param cosmo + 3 I.A + 11 bias photo correlated 
FISH_XC_SYM = sym('xc_',[21,21],'positive');
% Force symmetry for GCph
FISH_XC_SYM = tril(FISH_XC_SYM.') + triu(FISH_XC_SYM,1)
% Brutal Common Bias : sum of 7 cosmo param ans 5 bias spectro : FISH_ALL1 = first left matrix
FISH_ALL1 = sym('xc_',[12,12],'positive');
% Sum cosmo
FISH_ALL1(1:7,1:7) = FISH_GCsp_SYM(1:7,1:7) + FISH_XC_SYM(1:7,1:7);
% Brutal sum of bias
FISH_ALL1(7:12,7:12) = FISH_GCsp_SYM(7:12,7:12) + FISH_XC_SYM(15:20,15:20);
% Adding new observable "O" terms
FISH_O_SYM = sym('o_',[2,2],'positive');
% DeFinition of sigma_o
SIGMA_O = sym('sigma_o','positive');
FISH_O_SYM = 1/(SIGMA_O*SIGMA_O) * FISH_O_SYM
% Force symmetry
FISH_O_SYM = (tril(FISH_O_SYM.') + triu(FISH_O_SYM,1))
FISH_O_SYM
%FISH_SYM = sym('xc_',[31,31],'positive');
%FISH_BIG_GCsp = sym('sp_','positive');
%FISH_BIG_XC = sym('xc_','positive');
FISH_SYM = zeros(31,31,'sym');
FISH_BIG_GCsp = zeros(31,'sym');
FISH_BIG_XC = zeros(31,'sym');

% Block bias spectro + pshot and correlations;
FISH_BIG_GCsp(1:7,1:7);
FISH_BIG_GCsp(7:17,7:17) = FISH_GCsp_SYM(7:17,7:17);
FISH_BIG_GCsp(1:7,7:17) = FISH_GCsp_SYM(1:7,7:17);
FISH_BIG_GCsp(7:17,1:7) = FISH_GCsp_SYM(7:17,1:7);

% Block bias photo and correlations;
FISH_BIG_XC(1:7,1:7) = FISH_XC_SYM(1:7,1:7);
FISH_BIG_XC(21:31,21:31) = FISH_XC_SYM(11:21,11:21);
FISH_BIG_XC(1:7,21:31) = FISH_XC_SYM(1:7,11:21);
FISH_BIG_XC(21:31,1:7) = FISH_XC_SYM(11:21,1:7);

% Block I.A and correlations;
FISH_BIG_XC(18:20,18:20) = FISH_XC_SYM(8:10,8:10);
FISH_BIG_XC(1:7,18:20) = FISH_XC_SYM(1:7,8:10);
FISH_BIG_XC(18:20,1:7) = FISH_XC_SYM(8:10,1:7);

% Final summation
FISH_SYM = FISH_BIG_GCsp + FISH_BIG_XC;

% Add O observable
FISH_SYM(6,6) = FISH_SYM(6,6) + FISH_O_SYM(1,1);
FISH_SYM(6,26) = FISH_SYM(6,26) + FISH_O_SYM(2,2);
FISH_SYM(26,6) = FISH_SYM(26,26) = FISH_SYM(26,1);

% Force symmetry
FISH_SYM = (tril(FISH_SYM.') + triu(FISH_SYM,1))

% Marginalize FISH_SYM2 in order to get back a 2x2 matrix
% Invert to marginalyze : take a long long time 
COV_ALL = inv(FISH_SYM);
% Marginalize
COV_ALL([13:31],:) = [];
COV_ALL(:,[13:31]) = [];
FISH_ALL2 = inv(COV_ALL);
FISH_ALL1
FISH_ALL2
% Matricial equation to solve
eqn = FISH_ALL1 == FISH_ALL2;
% Solving : sigma_o unkNown
[solx,parameters,conditions] = solve(eqn,SIGMA_O,'ReturnConditions',true);
solx

我认为我必须获得“已知方法”来求逆矩阵,以避免使用 INV Matlab 的函数应用原始求逆。

也许 GPU 可以利用这种技术。如果不是这样也不错,最重要的是找到一种符号矩阵求逆的算法,允许在运行时获得。

我可能会使用哪些现有的反演算法?

更新 1

这是我在这个脚本中所做的。

首先,方程组只是具有 2 个 12x12 矩阵的等式。第一个是通过删除列/行来快速获得的,以获得第一个 12x12 矩阵。

第二个矩阵更难得到:我必须对一个 31x31 矩阵求逆,然后在逆矩阵上,我通过删除所有令人讨厌的 Moterms 来边缘化,也就是说,通过删除列/行来获得 12x12 矩阵和我将后者逆反以最终使第二个矩阵等于上述第一个矩阵。

更新 2

我意识到有可能减少运行时间,多亏了 Schur complement :确实,我们可以这样写:

Method od Schur

我做了以下修改

% Using Schur complement formula
D = FISH_SYM(13:31,13:31)
inv_D = inv(D)
% Apply formula of Schur complement
COV_ALL = FISH_SYM(1:12,1:12) - FISH_SYM(1:12,13:31)*inv_D*FISH_SYM(13:31,1:12)
FISH_ALL2 = inv(COV_ALL);

代替在 31x31 矩阵上进行第一次反转的“大”反转:

COV_ALL = inv(FISH_SYM);
% Marginalize
COV_ALL([13:31],[13:31]) = [];
FISH_ALL2 = inv(COV_ALL);

你认为我的修改正确吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)