“内存不足”符号矩阵求逆矩阵

12个视图(30天)
我需要设置一个程序使用符号矩阵。然而,数学显然变得足够复杂,采取3 x3的符号矩阵的逆占用太多内存。我想问我如何规避的内存问题。下面是有关导致问题的代码段:
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,乐(1)* Cconc1。* Cconc2,乐(1)*乐(2)* Cconc1。* Cconc2。^ 2);
关于EE %计算:
%没有区别使用\或发票()在内存使用
%方程分裂成更小的部分,下面也不协助
preEEinv1 = (CC ' * CC);
preEEinv2 =(发票(preEEinv1));
清晰的preEEinv1
EE = (preEEinv2 * (CC ' * DD));
%注意- CC是51 x3矩阵,KK 2 x1向量,弟弟是一个51 x1向量
%先前- - > 1)EE = (CC ' * CC) \ (CC ' * DD);
% 2)EE =发票(CC ' * CC) * (CC ' * DD);
以下是当执行代码返回的错误消息
错误使用symengine
的内存。
错误信谊/ privUnaryOp(第1045行)
Csym = mupadmex (op, args {1}。s,变长度输入宗量{:});
错误信谊/发票(22)行
X = privUnaryOp (,“symobj::发票”);
错误在sym_r(第98行)
preEEinv2 =(发票(preEEinv1));
我不习惯在我的电脑的内存错误,我有点我的深度。同样的,如果你需要有关我的硬件信息,我使用16 GB的RAM, i7 3.60 GHz处理器,65 GB的虚拟空间。
错误行指示总是倒数的位置。我不要做不必要的数据拷贝,不能使用稀疏矩阵。符号工具箱的高功能不工作。我尝试确保反相更简单的符号矩阵函数是声音,它工作。有一个方法可以绕过或解决内存问题?

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年8月19日
信谊EE 3 [3]
EEinv =发票(EE);
preEEinv2 =潜艇(EE, EEinv preEEinv1);
,而不是直接将你的倒数3 x 3矩阵计算,而不是以一个示例3 x 3矩阵的逆,一旦你,代入实际的矩阵的条目的占位符。这通常是 得更快。
顺便说一下:在我看来,你可能使用实值数量。如果是这样,那么我建议您添加的假设,例如
假设(KK,“真实”的)
假设(Cconc1 > = 0)
适合你的情况。你preEEinv1有很多连接词()调用,可以删除如果你正在与真实值。
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年11月6日
发票(S) = 1 /侦破的(S) * (S)
在哪里
的(S) = C (S) ^ T C (S)是辅因子矩阵和^ T是转置。
所以你可以在部分首先建立逆计算determinanent然后计算元素的代数余子式矩阵;你可以划分为每个元素,执行适当的替换,并将结果保存在一个单独的文件,如果你需要。
但是如果你没有足够的内存来存储整个逆,然后你打算 逆?通常你不会计算矩阵的逆只是为了好玩,你通常会想要做一个计算,乘以另一个矩阵,为了做到这一点,你需要一行(或列)的逆矩阵相乘的每个不同的输出。
基本上你总是在灾难的边缘的计算:如果一个N * N矩阵菌株资源,然后(N + 1) x (N + 1)矩阵或(N + 2) x (N + 2)矩阵会压倒它。
我想可能会有一些并行方法涉及多个工人,和共享内存(或共享文件)系统,和一个锁,以确保系统计算不完了……它可能会是SNMP。也许不是一个锁系统,而是一个系统的队列……这可能更有意义。

登录置评。

更多的答案(0)

类别

找到更多的在函数创建帮助中心文件交换

下载188bet金宝搏


释放

R2020a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的