从模拟问题,我想在MATLAB中计算大约1000x1000的复方形矩阵。由于这些值是贝塞尔函数的值,因此矩阵并不稀疏。
由于我对某个参数(在我的情况下搜索到的特征函数的能量)的行列式变化感兴趣,我现在通过首先搜索所研究范围的重新缩放因子然后计算来克服该问题决定因素,
result(k) = det(pre_factor*Matrix{k});
现在这是一个非常尴尬的解决方案,仅适用于最大500x500的矩阵尺寸。
有人知道这个问题的一个很好的解决方案吗?与Mathematica的接口可能原则上有效,但我对可行性有疑问。 提前谢谢
罗伯特
编辑:我没有找到计算问题的方便解决方案,因为这需要更改为更高的精度。相反,我用了那个
ln det M = trace ln M
,当我相对于k
推导它时A = trace(inv(M(k))*dM/dk)
所以我至少改变了关于k的行列式的对数。从问题的物理背景我可以得出A的约束,这最终给了我一个对我的问题有效的解决方法。不幸的是,我不知道这样的解决方法是否可以推广。
答案 0 :(得分:5)
您应该意识到,当您将矩阵乘以常数k时,您可以将矩阵的行列式缩放k ^ n,其中n是矩阵的维数。因此,对于n = 1000和k = 2,您可以通过
来缩放行列式>> 2^1000
ans =
1.07150860718627e+301
这当然是一个巨大的数字,所以你可能会认为它会失败,因为在双精度中,MATLAB只会表示与realmax一样大的浮点数。
>> realmax
ans =
1.79769313486232e+308
没有必要做重新计算这个决定因素的所有工作,而不是计算像这样的巨大矩阵的决定因素,无论如何都是一个非常好的问题。
答案 1 :(得分:4)
如果速度不是问题,您可能需要使用det(e^A) = e^(tr A)
并将A
缩放为矩阵的一些常量(以使A - I
的光谱半径小于1)。
编辑:在MatLab中,矩阵(logm
)的对数通过三角化计算。所以你最好计算矩阵的特征值并乘以它们(或者更好,加上它们的对数)。您没有指定矩阵是否对称:如果是,则查找特征值比不匹配更容易。
答案 2 :(得分:1)
你说决定因素的当前值大约是10 ^ -300。
你是否试图让决定因素达到某个值,比如1?如果是这样,重新缩放是不方便的:您正在考虑的矩阵是ill-conditioned,并且考虑到机器的精度,您应该将输出行列式视为零。换句话说,不可能获得可靠的反转。
我建议修改矩阵的列或行,而不是重新缩放它。
我使用R用随机矩阵(随机正态值)进行小测试,似乎行列式应该明显不为零。
> n=100
> M=matrix(rnorm(n**2),n,n)
> det(M)
[1] -1.977380e+77
> kappa(M)
[1] 2318.188
答案 3 :(得分:1)
这不是严格意义上的matlab解决方案,但您可能需要考虑使用Mahout。它专为大规模线性代数而设计。 (1000x1000对于以前的音阶来说没有问题。)
您可以call into java向/从Mahout传递数据。