如何解决从符号矩阵到数值的大量替换,同时将 4 个未知数保留到新矩阵中
我必须解决包含大量符号变量的 2 个 12x12 矩阵之间的相等性,并使用它们执行矩阵求逆。只有一个未知名称为 SIGAM_O,and FISH_O_SYM(1,1),FISH_O_SYM(1,2) and FISH_O_SYM(2,2) (FISH_O_SYM(2,1) = FISH_O_SYM(1,2)
。
当我以 2 个 2x2 矩阵为例时,我的系统很快就得到了解决,反演非常直接。
现在,对于 2 个 12x12 矩阵的情况,我需要在实际反转符号变量的 31x31 矩阵之前(我在之后边缘化),因为反转需要很多时间。
我想从我的 GPU NVIDIA 卡中受益以更快地实现这种反转,但目前不支持符号数组的 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
实际上,这种 31x31 大小的反转需要很长时间(我不得不停止它)。
所以,现在的策略是用数值替换几乎所有符号未知数:我只想保留 4 个未知数 (SIGAM_O,2)
)
所以,我想知道如何用这两个矩阵的等价物的数值对数组 FISH_XC_SYM
和 FISH_GCsp_SYM
进行大量替换。
我可以这样做:
FISG_GCsp_NUM = load('Fisher_GCsp_num.dat')
FISG_XC_NUM = load('Fisher_XC_num.dat')
但是如何将数组 FISH_GCsp_SYM
和 FISH_XC_SYM
的数值快速分配给数组 FISH_GCsp_NUM
和 FISH_XC_NUM
,同时保持上面的 4 未知?
解决方法
(代表问题作者发布答案,以便将其移至答案空间)。
我通过简单的方式解决了这个问题:
FISH_GCsp_SYM = load('file1.dat);
FISH_XC_SYM = load('file2.dat');
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_GCsp_SYM(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);
一切都完成了!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。