Ask Your Question

Revision history [back]

Ideally, there should be a random_element method but it is not implemented (yet). There seems to be a number of algorithms out there, so if you plan to implement one, please consider contributing it into Sage !

If you so not really mind the density, you can just look at the QR-decomposition of a random real matrix (though this itself is not well defined):

sage: G = MatrixSpace(RDF,3)
sage: M = G.random_element()
sage: M
[ -0.1404815835403903   -0.907286820365103  -0.6367014795215493]
[ -0.8102701316983039  -0.6717220161934689  -0.8229332100998983]
[ 0.07523133592237663 -0.12920794641969602   0.8627681516027308]
sage: M.QR()[0]
[ -0.1701173836118859   0.9573741300667837 -0.23344132211739152]
[ -0.9812035951583826 -0.14266646456180654  0.12994531441225488]
[ 0.09110203423256512  0.25115942142054726   0.9636489840135694]

Or as a one-liner:

sage: MatrixSpace(RDF,3).random_element().QR()[0]
[ -0.7533460901267146  0.23805009753414352  -0.6130267690360484]
[ -0.6227231008312081 0.041418062637191194   0.7813453038052681]
[ 0.21138970689689907   0.9703693601672336    0.117037159341282]

If you mind having the density corresponding to the Haar measure, according to https://en.wikipedia.org/wiki/Orthogonal_matrix#Randomization you can generate a real matrix with Gaussian entries such that the diagonal ones are positive:

sage: dim = 3
sage: M = Matrix(RDF, dim, dim, [normalvariate(0,1) for _ in range(dim^2)])
sage: for i in range(dim): 
    M[i,i] = abs(M[i,i])
sage: M
[ 0.0795518237100608 0.07691005207967933  1.0416355962282533]
[ 0.4941624083721146 0.06751228996968504  1.6387527474726973]
[ 1.8797460779164274 0.05562094144225769  0.8965938466096621]
sage: M.QR()[0]
[-0.04089557143145095  -0.8217108088199684  -0.5684354835033859]
[ -0.2540363391790334  -0.5416652758107634   0.8012891284407673]
[ -0.9663297007821968  0.17717244607805865 -0.18659269475761167]

sage: G = MatrixSpace(RDF,3)
sage: M = G.random_element()

Ideally, there should be a random_element method but it is not implemented (yet). There seems to be a number of algorithms out there, so if you plan to implement one, please consider contributing it into Sage !

If you so not really mind the density, you can just look at the QR-decomposition of a random real matrix (though this itself is not well defined):

sage: G = MatrixSpace(RDF,3)
sage: M = G.random_element()
sage: M
[ -0.1404815835403903   -0.907286820365103  -0.6367014795215493]
[ -0.8102701316983039  -0.6717220161934689  -0.8229332100998983]
[ 0.07523133592237663 -0.12920794641969602   0.8627681516027308]
sage: M.QR()[0]
[ -0.1701173836118859   0.9573741300667837 -0.23344132211739152]
[ -0.9812035951583826 -0.14266646456180654  0.12994531441225488]
[ 0.09110203423256512  0.25115942142054726   0.9636489840135694]

Or as a one-liner:

sage: MatrixSpace(RDF,3).random_element().QR()[0]
[ -0.7533460901267146  0.23805009753414352  -0.6130267690360484]
[ -0.6227231008312081 0.041418062637191194   0.7813453038052681]
[ 0.21138970689689907   0.9703693601672336    0.117037159341282]

If you mind having the density corresponding to the Haar measure, according to https://en.wikipedia.org/wiki/Orthogonal_matrix#Randomization you can generate a real matrix with Gaussian entries such that the diagonal ones are positive:

sage: dim = 3
sage: M = Matrix(RDF, dim, dim, [normalvariate(0,1) for _ in range(dim^2)])
sage: for i in range(dim): 
    M[i,i] = abs(M[i,i])
sage: M
[ 0.0795518237100608 0.07691005207967933  1.0416355962282533]
[ 0.4941624083721146 0.06751228996968504  1.6387527474726973]
[ 1.8797460779164274 0.05562094144225769  0.8965938466096621]
sage: M.QR()[0]
[-0.04089557143145095  -0.8217108088199684  -0.5684354835033859]
[ -0.2540363391790334  -0.5416652758107634   0.8012891284407673]
[ -0.9663297007821968  0.17717244607805865 -0.18659269475761167]

sage: G = MatrixSpace(RDF,3)
sage: M = G.random_element()

Ideally, there should be a random_element method but it is not implemented (yet). There seems to be a number of algorithms out there, so if you plan to implement one, please consider contributing it into Sage !

If you so do not really mind the density, you can just look at the QR-decomposition of a random real matrix (though this itself is not well defined):

sage: G = MatrixSpace(RDF,3)
sage: M = G.random_element()
sage: M
[ -0.1404815835403903   -0.907286820365103  -0.6367014795215493]
[ -0.8102701316983039  -0.6717220161934689  -0.8229332100998983]
[ 0.07523133592237663 -0.12920794641969602   0.8627681516027308]
sage: M.QR()[0]
[ -0.1701173836118859   0.9573741300667837 -0.23344132211739152]
[ -0.9812035951583826 -0.14266646456180654  0.12994531441225488]
[ 0.09110203423256512  0.25115942142054726   0.9636489840135694]

Or as a one-liner:

sage: MatrixSpace(RDF,3).random_element().QR()[0]
[ -0.7533460901267146  0.23805009753414352  -0.6130267690360484]
[ -0.6227231008312081 0.041418062637191194   0.7813453038052681]
[ 0.21138970689689907   0.9703693601672336    0.117037159341282]

If you mind having the density corresponding to the Haar measure, according to https://en.wikipedia.org/wiki/Orthogonal_matrix#Randomization you can generate a real matrix with Gaussian entries such that the diagonal ones are positive:

sage: dim = 3
sage: M = Matrix(RDF, dim, dim, [normalvariate(0,1) for _ in range(dim^2)])
sage: for i in range(dim): 
    M[i,i] = abs(M[i,i])
sage: M
[ 0.0795518237100608 0.07691005207967933  1.0416355962282533]
[ 0.4941624083721146 0.06751228996968504  1.6387527474726973]
[ 1.8797460779164274 0.05562094144225769  0.8965938466096621]
sage: M.QR()[0]
[-0.04089557143145095  -0.8217108088199684  -0.5684354835033859]
[ -0.2540363391790334  -0.5416652758107634   0.8012891284407673]
[ -0.9663297007821968  0.17717244607805865 -0.18659269475761167]