SquareMatrix.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5123 0a006004102a
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5123
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
     1
"{ Encoding: utf8 }"
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
     2
5084
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ Package: 'stx:libbasic2' }"
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
"{ NameSpace: Smalltalk }"
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
TwoDimensionalMatrix variableSubclass:#SquareMatrix
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	instanceVariableNames:''
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	classVariableNames:''
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
	poolDictionaries:''
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	category:'Collections-MultiDimensional'
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
5123
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    15
!SquareMatrix class methodsFor:'instance creation'!
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    16
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    17
withAll:elements
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    18
    |numElements nRows|
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    19
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    20
    numElements := elements size.
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    21
    nRows := numElements integerSqrt.
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    22
    self assert:(nRows * nRows == numElements) description:'number of elements is not square'.
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    23
    ^ (self new:numElements) 
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    24
        replaceFrom:1 with:elements;
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    25
        setDimensions:{nRows . nRows }
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    26
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    27
    "
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    28
     Matrix3_3  withAll:#(11 12 13 21 22 23 31 32 33) 
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    29
    "
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    30
! !
0a006004102a #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5084
diff changeset
    31
5084
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!SquareMatrix methodsFor:'matrix operations'!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
determinant
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    "Answer the determinant of this matrix.
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    Note that if your only interest in the determinant is to decide whether or not the matrix is singular,
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    you're better off using #isSingular which is not subject to numeric overflow."
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    ^ self determinantByLuDecomposition
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    "
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
     (Matrix identity:3) determinantByCofactors
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    "
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
determinantByCofactors
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    "Answer the determinant of this matrix."
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    dimensions = #( 1 1 ) ifTrue: [ ^ self _at: 1 at: 1 ].
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    "General case"
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    ^(1 to: self columns) 
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
            inject: 0 
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
            into: [ :tot :c | tot + ((self _at: 1 at: c) * (self cofactor: 1@c)) ]
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
determinantByLuDecomposition
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        "Answer the determinant of a matrix."
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        | lu prod |
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
        lu := self luForm.
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
        prod := self luForm rowInterchangeSign.
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        1 to: lu rows do: [ :i |
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
                (lu at: i at: i) <= lu comparisonTolerance ifTrue: [ ^0 ].
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
                prod := prod * (lu at: i at: i) asFraction ].
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        ^prod
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
! !
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!SquareMatrix methodsFor:'queries'!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
isSquare
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    ^ true
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
! !
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!SquareMatrix class methodsFor:'documentation'!
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
version_CVS
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    ^ '$Header$'
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
! !
5f942ac93795 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85