Generate random nxn matrix with all negative eigenvalues

I need to generate an nxn matrix with random entries, but I also need all of the eigenvalues to be negative (real or complex doesn’t matter).
I have:

r = 4; (* matrix dimension *)
dom = {1, 10}; (* domain of random numbers *)
eig = DiagonalMatrix[-RandomInteger[dom, r]] (* eigenvalues in diagonal matrix *)
v = RandomVariate[NormalDistribution[], {r, r}] (* normalized eigenvectors? *)
A = v.eig.v

It seems like this should work, as the eigenvalues are all negative, but sometimes I still get positive eigenvalues. What am I doing wrong here?




1 Answer


RandomVariate[NormalDistribution[], {r, r}] does not give you normalized eigenvectors. To obtain an orthonormal basis, you can first generate a random matrix, and then apply Orthogonalize to it. Following is the correct code.

r=4;(*matrix dimension*)
dom={1,10};(*domain of random numbers*)
eig=DiagonalMatrix[-RandomInteger[dom,r]] (*eigenvalues in diagonal matrix*)
v=Orthogonalize@RandomReal[{-1,1},{r,r}](*orthonormal eigenvectors*)