当反转符号矩阵时,“内存不足”

2次浏览(过去30天)
Wikus马瑞医生
Wikus马瑞医生 2021年8月19日
我需要用符号矩阵建立一个程序。然而,数学显然变得非常复杂,以至于计算一个3x3符号矩阵的逆占用了太多内存。我想问一下如何避免内存问题。以下是导致问题的相关代码段:
v = (“(”sprintf (“孔卡% d。”1)];
v(结束)=“]”
Cconc1 = str2sym(v);
清晰的v
v = (“(”sprintf (“concb % d”,1)];
v(结束)=“]”
Cconc2 = str2sym(v);
清晰的v
v = (“(”sprintf (“乐% d”,1:2)];
v(结束)=“]”
KK = str2sym(v);
Kk = Kk ';
Cconc1 = Cconc1';
Cconc2 = Cconc2';
正在设置符号CC矩阵
CC = [Cconc1, KK(1)*Cconc1.]* Cconc2,乐(1)*乐(2)* Cconc1。* Cconc2。^ 2);
EE计算:
在内存使用上使用\或inv()没有区别
将方程式分解成更小的部分也没有帮助。
preEEinv1 = (CC'*CC);
preEEinv2 = (inv(preEEinv1));
清晰的preEEinv1
EE = (preEEinv2*(CC'*DD));
注:CC是一个51x3的矩阵,KK是一个2x1的向量,DD是一个51x1的向量
%先前——> 1)EE = (CC ' * CC) \ (CC ' * DD);
% 2) EE = inv(CC'*CC)*(CC'*DD);
下面是执行代码时返回的错误消息
错误使用symengine
的内存。
错误sym/privUnaryOp(第1045行)
Csym = mupadmex(op,args{1}.s,varargin{:});
错误在sym/inv中(第22行)
X = privUnaryOp(A;“symobj::发票”);
错误在sym_r中(第98行)
preEEinv2 = (inv(preEEinv1));
因为我不习惯在我的电脑上处理内存错误,所以我有点力不从心。此外,如果您需要有关我的硬件的信息,我使用16 GB RAM, i7 3.60 GHz处理器和65 GB虚拟空间。
误差线指示总是在取逆的地方。我不做不必要的数据拷贝,也不能使用稀疏矩阵。tall函数也不适用于符号工具箱。我曾尝试反转更简单的符号矩阵,以确保函数是健全的,它工作。有没有一种方法可以绕过或解决内存问题?

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年8月19日
信谊Ee [3 3]
EEinv = inv(EE);
preEEinv2 = subs(EEinv, EE, preEEinv1);
也就是说,不是直接求你计算出来的3 × 3矩阵的逆,而是求一个3 × 3矩阵的逆,一旦你得到了这个,就把实际的矩阵元素代入到占位符中。这是典型的 得更快。
顺便说一下,在我看来你可能用的是实数。如果是这样,那么我建议您添加假设,例如
假设(KK,“真实”的
假设(Cconc1 >= 0)
适合你的情况。您的preEEinv1有许多conj()调用,如果您使用的是实际值,则可以删除这些调用。
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年8月20日
另一个好处是,如果你有一系列的2 × 2, 3 × 3,或4 × 4的逆运算要做,那么你可以预先计算模板的inv(),然后只需要subs()。
但是,我不建议对符号5 x 5或更高版本执行inv()。5 x 5将是绝对的上限,对于您愿意花几个小时来预先计算逆的情况(但是接下来使用subs()可能会给您一些太大的东西,无法真正使用。)

登录评论。

更多答案(0)

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!