生成矩阵对称和正定

时间:2018-02-11 21:36:41

标签: c++ matlab matrix

我想将共轭梯度法应用于大小为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

这是真的吗?如果没有,我该如何生成它?

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);