我想将共轭梯度法应用于大小为nxn的随机矩阵。该方法需要矩阵对称和正定。我在Matlab和C ++中这样做。
我知道如何做一个simetric矩阵,但我不知道如何才能使矩阵确定。
我正在阅读这篇文章,我可以通过A = A'* A生成它而我不关心值范围。 How to make a matrix positive definite whose elements lie in the range 0.8 to 1 and -0.8 to -1
这是真的吗?如果没有,我该如何生成它?
答案 0 :(得分:0)
当我在Matlab中搜索创建对称正定矩阵的方法时,Google返回的第一个结果指向this question。让我们在接受的答案中发布函数(其语法实际上需要稍微修复一下):
function A = generateSPDmatrix(n)
A = rand(n);
A = 0.5 * (A + A');
A = A + (n * eye(n));
end
现在,在Matlab中检查给定矩阵是否对称是非常容易的,您所要做的就是使用内置的issymmetric function。如本主题中所述,chol function可以帮助确定矩阵是否为正定...但在某些情况下它可能会失败,从计算的角度来看,它总体上非常昂贵。幸运的是,如果矩阵是对称的,则可以使用另一种方法:检查其所有特征值是否为正。让我们把所有这些放在一起:
function res = is_SPD(M)
if (~issymmetric(M))
res = false;
return;
end
ev = eig(M);
if (any(ev <= 0))
res = false;
return;
end
res = true;
end
最后,让我们进行一些测试:
res = zeros(1,10);
for i = 1:10
M = generateSPDmatrix(20);
res(i) = is_SPD(M);
end
disp(res);