我想生成正随机半定矩阵.我正在寻找算法或更优选地用C,matlab,java或任何语言的算法的简单实现.
生成随机矩阵
乘以它自己的换位
你已经获得了一个正的半定矩阵.
示例代码(Python):
from scipy import random, linalg matrixSize = 10 A = random.rand(matrixSize,matrixSize) B = numpy.dot(A,A.transpose()) print 'random positive semi-define matrix for today is', B
您需要明确"随机"的定义.您对结果矩阵的约束是什么?您希望系数均匀分布或正态分布吗?您是否希望特征值具有特定分布?(等等.)
有许多方法可以生成正半定矩阵M,包括:
给定任意矩阵A,计算M = A T A(构造Cholesky分解)
给定具有非负对角线条目的任意对角矩阵S和相同大小的标准正交矩阵Q,计算M = QSQ T(构造奇异值分解)
由于数值原因,我可能会通过生成具有所需属性的对角矩阵来选择第二种方法,然后生成Q作为多个Householder反射的组合(生成随机向量v,缩放到单位长度,H = I - 2vv T); 我怀疑你想要使用K*N,其中N是矩阵M的大小,而K是1.5-3之间的数字(我猜这个)确保它有足够的自由度.
您还可以使用Givens旋转生成正交矩阵Q :从1到N选择2个不同的值,并围绕该对轴生成Givens旋转,角度从0到2*pi均匀分布.然后取这些的K*N(与上段相同的推理)并且它们的组成产生Q.
编辑:我猜(不确定)如果你有独立生成和正态分布的系数,那么矩阵作为一个整体将是"正态分布"(无论这意味着什么).至少对于矢量来说这是真的.(N个独立生成的高斯随机变量,每个分量一个,为您提供高斯随机向量)对于均匀分布的分量,情况并非如此.
如果你可以用你选择的语言生成一个随机矩阵,那么通过使用矩阵乘以其转置的属性为正半除法,你可以生成一个随机的正半定矩阵.
在Matlab中,它将如此简单
% Generate a random 3x3 matrix A = rand(3,3) % Multiply by its tranpose PosSemDef = A'*A
正半定矩阵的自然分布是Wishart分布.