@@ -98,25 +98,29 @@ PMQRTest >> testMoorePenroseInverseOfNonRandomMatrix [
9898
9999{ #category : #tests }
100100PMQRTest >> testMoorePenroseInverseOfProductOfMatrices [
101+
101102 | a inverse |
102- a := PMMatrix new initializeRows:
103- #( #( 5 40 1 ) #( 0 0 1 ) #( 0 0 1 ) ).
104-
105- a := a * (PMMatrix rows: 3 columns: 3 random: 5.0 ).
106- inverse := a mpInverse .
107- self assert: inverse isMoorePenroseInverseOf: a.
103+ a := PMMatrix new initializeRows: #( #( 5 40 1 ) #( 0 0 1 ) #( 0 0 1 ) ).
104+
105+ a := a * (PMMatrix
106+ rows: 3
107+ columns: 3
108+ random: 5.0
109+ generator: (Random seed: 42 )).
110+ inverse := a mpInverse.
111+ self assert: inverse isMoorePenroseInverseOf: a
108112]
109113
110114{ #category : #tests }
111115PMQRTest >> testMoorePenroseInverseOfRandomMatrixIsAnInverse [
112- "
116+ "
113117Proofs for the properties below can be found in literature:
114118If A has real entries, then so does A+
115119If A is invertible, its pseudoinverse is its inverse. That is, A+ = A**−1
116120"
117121
118122 | a |
119- a := PMSymmetricMatrix new : 4 random: 1.0 .
123+ a := PMSymmetricMatrix new : 4 random: 1.0 generator: ( Random seed: 42 ) .
120124 self assert: (a mpInverse closeTo: a inverse)
121125]
122126
@@ -125,9 +129,13 @@ PMQRTest >> testOrthogonalize [
125129
126130 | a b i |
127131 i := 0 .
128- [
129- a := PMMatrix rows: 5 columns: 5 random: 5.0 .
130- a rank = 5 ifTrue: [
132+ [
133+ a := PMMatrix
134+ rows: 5
135+ columns: 5
136+ random: 5.0
137+ generator: (Random seed: 42 ).
138+ a rank = 5 ifTrue: [
131139 a atRow: 2 put: (a rowAt: 1 ) + (3 * (a rowAt: 3 )).
132140 a atRow: 4 put: 3.11 * (a rowAt: 2 ).
133141 b := a orthogonalize.
@@ -146,60 +154,55 @@ PMQRTest >> testOrthogonalize [
146154PMQRTest >> testQRFactorization [
147155
148156 | a qr |
149- 5 timesRepeat: [
150- a := PMMatrix rows: 5 columns: 4 random: 10.0 .
157+ 5 timesRepeat: [
158+ a := PMMatrix
159+ rows: 5
160+ columns: 4
161+ random: 10.0
162+ generator: (Random seed: 42 ).
151163 qr := a qrFactorization.
152164 self assert: (a closeTo: qr first * qr second).
153- self assert: (qr first squared closeTo:
154- (PMSymmetricMatrix identity: qr first numberOfColumns)).
155- 2 to: qr second numberOfRows do: [ :r |
156- self assert: (((qr second rowAt: r) first: r - 1 ) closeTo:
157- (Array new : r - 1 withAll: 0 )) ].
165+ self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
166+ 2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1 ) closeTo: (Array new : r - 1 withAll: 0 )) ].
158167
159168 qr := a qrFactorizationWithPivoting.
160- self assert:
161- (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3 ))).
162- self assert: (qr first squared closeTo:
163- (PMSymmetricMatrix identity: qr first numberOfColumns)).
164- 2 to: qr second numberOfRows do: [ :r |
165- self assert: (((qr second rowAt: r) first: r - 1 ) closeTo:
166- (Array new : r - 1 withAll: 0 )) ].
167-
168- a := PMSymmetricMatrix new : 4 random: 10.0 .
169+ self assert: (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3 ))).
170+ self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
171+ 2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1 ) closeTo: (Array new : r - 1 withAll: 0 )) ].
172+
173+ a := PMSymmetricMatrix new : 4 random: 10.0 generator: (Random seed: 42 ).
169174 qr := a qrFactorization.
170175 self assert: (a closeTo: qr first * qr second).
171- self assert: (qr first squared closeTo:
172- (PMSymmetricMatrix identity: qr first numberOfColumns)).
173- 2 to: qr second numberOfRows do: [ :r |
174- self assert: (((qr second rowAt: r) first: r - 1 ) closeTo:
175- (Array new : r - 1 withAll: 0 )) ].
176+ self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
177+ 2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1 ) closeTo: (Array new : r - 1 withAll: 0 )) ].
176178
177179 qr := a qrFactorizationWithPivoting.
178- self assert:
179- (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3 ))).
180- self assert: (qr first squared closeTo:
181- (PMSymmetricMatrix identity: qr first numberOfColumns)).
182- 2 to: qr second numberOfRows do: [ :r |
183- self assert: (((qr second rowAt: r) first: r - 1 ) closeTo:
184- (Array new : r - 1 withAll: 0 )) ] ]
180+ self assert: (a closeTo: qr first * (qr second inversePivotColumns: (qr at: 3 ))).
181+ self assert: (qr first squared closeTo: (PMSymmetricMatrix identity: qr first numberOfColumns)).
182+ 2 to: qr second numberOfRows do: [ :r | self assert: (((qr second rowAt: r) first: r - 1 ) closeTo: (Array new : r - 1 withAll: 0 )) ] ]
185183]
186184
187185{ #category : #tests }
188186PMQRTest >> testRank [
187+
189188 | random randomNumber matrix |
190189 random := Random new .
191-
190+
192191 10 timesRepeat: [
193- matrix := PMMatrix rows: 5 columns: 7 random: 5.0 .
192+ matrix := PMMatrix
193+ rows: 5
194+ columns: 7
195+ random: 5.0
196+ generator: (Random seed: 42 ).
194197 matrix rank = 5 ifTrue: [
195198 randomNumber := random nextBetween: 0 and : 3 .
196199 matrix atRow: 2 put: (matrix rowAt: 1 ) + (randomNumber * (matrix rowAt: 3 )).
197-
200+
198201 randomNumber := random nextBetween: 0 and : 3 .
199- matrix atRow: 4 put: ( 0.5 + randomNumber) * (matrix rowAt: 5 ).
200-
202+ matrix atRow: 4 put: 0.5 + randomNumber * (matrix rowAt: 5 ).
203+
201204 self assert: matrix rank equals: 3 .
202- self assert: matrix transpose rank equals: 3 ] ].
205+ self assert: matrix transpose rank equals: 3 ] ]
203206]
204207
205208{ #category : #tests }
@@ -243,17 +246,14 @@ PMQRTest >> testSimpleQRDecompositionWithPivot [
243246
244247{ #category : #tests }
245248PMQRTest >> testVectorHouseholder [
246-
247249 " result is householdermatrix * v"
248250
249- (2 to: 5 ) do: [ :i |
251+ (2 to: 5 ) do: [ :i |
250252 | v h result |
251- (1 to: 9 ) do: [ :unimportant |
252- v := PMVector new : i random: 5.8 .
253+ (1 to: 9 ) do: [ :unimportant |
254+ v := PMVector new : i random: 5.8 generator: ( Random seed: 42 ) .
253255 h := v householder.
254- result := (PMSymmetricMatrix identity: i)
255- - ((h at: 1 ) * (h at: 2 ) tensorProduct: (h at: 2 )) * v.
256+ result := (PMSymmetricMatrix identity: i) - ((h at: 1 ) * (h at: 2 ) tensorProduct: (h at: 2 )) * v.
256257 self deny: (result first closeTo: 0 ).
257- result allButFirst do: [ :aNumber |
258- self assert: (aNumber closeTo: 0 ) ] ] ]
258+ result allButFirst do: [ :aNumber | self assert: (aNumber closeTo: 0 ) ] ] ]
259259]
0 commit comments