Kirjoittaja: peki
Kirjoitettu: 09.05.2004 – 09.05.2004
Tagit: koodi näytille, vinkki
Matriisi kirjasto on dynaaminen, eli siihen käy minkätahansa kokoiset matriisit. Voit siis soveltaa sitä sekä 3d, että 2d transformaatioissa.
En ole tätä koodia täydellisesti testannut, eli bugeja saattaa olla. Jos löydät jonkun bugin, niin viitsisitkö siitä ilmoitella.
Tämä kirjasto käsittää mielestäni kaikki tarpeelliset toiminnot ja vähän enemmänkin.
Kuulisin mielelläni kommentteja, sillä tämän tekeminen kesti kauan.
Kiitos!
Kaikki koodi ei kuitenkaan ole omasta takaa, vaan olen joistakin muista matriisikirjastoista(c++) kääntänyt pätkiä vb.net:lle ja siten laajentanut kirjastoa.
Public Class Matrix
Private m_Data(,) As Double ' matriisi data
Private m_nCols As Integer ' sarakkeiden määrä
Private m_nRows As Integer ' rivien määrä
' lisätään identiteetti matriisin this matriisin(palauttaa myös kyseisen matriisin)
' käytetään etsittäessä käänteismatriisia
' Luokan käyttäjän ei välttämättä tarvitse koskaan käyttää tätä!
Public Function RightAppendIdentity() As Matrix
Dim i, j, q As Integer
Dim temp As Matrix
temp = New Matrix(0.0, m_nRows, (2 * m_nCols))
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j)
Next
Next
For q = 0 To m_nRows
temp.m_Data(q, m_nCols + q) = 1
Next
m_Data = temp.m_Data
m_nCols = temp.m_nCols
m_nRows = temp.m_nRows
Return Me
End Function
' poistetaan identiteetti matriisi this matriisista(palauttaa myös kyseisen matriisin)
' käytetään etsittäessä käänteismatriisia
' Luokan käyttäjän ei välttämättä tarvitse koskaan käyttää tätä!
Public Function LeftRemoveIdentity() As Matrix
Dim i, j As Integer
Dim temp As Matrix
temp = New Matrix(0.0, m_nRows, (m_nCols / 2))
For i = 0 To m_nRows
For j = 0 To m_nCols / 2
temp.m_Data(i, j) = m_Data(i, m_nCols / 2 + j)
Next
Next
m_Data = temp.m_Data
m_nCols = temp.m_nCols
m_nRows = temp.m_nRows
Return Me
End Function
#Region " Konstruktorit "
' perus konstruktori(sori c++ termiä, olen käyttänyt sitä liikaa =) )
' Data = Tyhjä; rows = columns = 0
Public Sub New()
m_nCols = m_nRows = 0
End Sub
'konstruktori yhdellä arvolla(kaikki alkiot samoja arvoja)
'rivit = 'Rows', sarakkeet = 'Cols'
'all spots of matrix = InitVal
Public Sub New(ByVal InitVal As Double, ByVal Rows As Integer, ByVal Cols As Integer)
Dim i, j As Integer
m_nRows = Rows
m_nCols = Cols
ReDim m_Data(m_nRows, m_nCols)
For i = 0 To m_nRows
For j = 0 To m_nCols
m_Data(i, j) = InitVal
Next
Next
End Sub
' konstruktori yksiulotteisella taulukolla
' rivit = 'Rows', sarakkeet = 'Cols'
' Kaikki pisteet matriisissa alustetaan siten, että data taulukko
' käydään läpi ja sen pisteet lyödään järjestyksessä matriisiin.
Public Sub New(ByVal Data() As Double, ByVal Rows As Integer, ByVal Cols As Integer)
Dim i, j As Integer
m_nRows = Rows
m_nCols = Cols
ReDim m_Data(m_nRows, m_nCols)
For i = 0 To m_nRows
For j = 0 To m_nCols
m_Data(i, j) = Data(i * m_nRows + j)
Next
Next
End Sub
' konstruktori kaksiulotteisella taulukolla
' rivit = 'Rows', sarakkeet = 'Cols'
' kaikki pisteet, jotka data sisältää, käydään läpi ja lyödään matriisiin.
Public Sub New(ByVal Data(,) As Double, ByVal Rows As Integer, ByVal Cols As Integer)
Dim i, j As Integer
m_nRows = Rows
m_nCols = Cols
ReDim m_Data(m_nRows, m_nCols)
Array.Copy(Data, m_Data, Data.Length)
End Sub
'Kopionti konstruktori
Sub New(ByVal obj As Matrix)
Dim i, j As Integer
m_nRows = obj.m_nRows
m_nCols = obj.m_nCols
ReDim m_Data(m_nRows, m_nCols)
Array.Copy(obj.m_Data, m_Data, obj.m_Data.Length)
End Sub
#End Region
#Region " Peruslaskutoimitukset "
' Lisää matriisiin parametri matriisi
Public Function Add(ByVal obj As Matrix) As Matrix
Dim i, j As Integer
If m_nRows <> obj.m_nRows Or m_nCols <> obj.m_nCols Then
MsgBox("Matriisit eivät samankokoisia")
Dim temp As Matrix
temp = New Matrix(0.0, m_nRows, m_nCols)
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j) + obj.m_Data(i, j)
Next
Next
Return temp
End If
Return Nothing
End Function
' Vähennä matriisista parametri matriisi
Public Function Subtract(ByVal obj As Matrix) As Matrix
Dim i, j As Integer
If m_nRows <> obj.m_nRows Or m_nCols <> obj.m_nCols Then
MsgBox("Matriisit eivät samankokoisia")
Dim temp As Matrix
temp = New Matrix(0.0, m_nRows, m_nCols)
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j) - obj.m_Data(i, j)
Next
Next
Return temp
End If
Return Nothing
End Function
' Kerro matriisi parametri matriisilla
Public Function Multiply(ByVal obj As Matrix) As Matrix
Dim i, j, q As Integer
If m_nCols <> obj.m_nRows Then
MsgBox("Matriisit väärän kokoisia")
End If
Dim sum As Double = 0
Dim prod As Double = 1
Dim temp As Matrix
temp = New Matrix(0.0, m_nRows, obj.m_nCols)
For i = 0 To temp.m_nRows
For j = 0 To temp.m_nCols
sum = 0
For q = 0 To m_nCols
prod = m_Data(i, q) * obj.m_Data(q, j)
sum += prod
Next
temp.m_Data(i, j) = sum
Next
Next
Return temp
Return Nothing
End Function
' kerro matriisi skalaari luvulla
Public Function Multiply(ByVal _d As Integer)
Dim temp As Matrix
Dim i, j As Integer
temp = New Matrix(m_Data, m_nCols, m_nRows)
For i = 0 To temp.m_nRows
For j = 0 To temp.m_nCols
temp.m_Data(i, j) *= _d
Next
Next
Return temp
End Function
' Jaa matriisi toisella matriisilla
Public Function Divide(ByVal obj As Matrix) As Matrix
Return (Me.Multiply(obj.GetInverse()))
End Function
'Jaa matriisi skalaari luvulla
Public Function Divide(ByVal _d As Integer)
Dim temp As Matrix
Dim i, j As Integer
If _d = 0 Then
MsgBox("Ei voi jakaa matriisia nollalla")
Return Nothing
End If
temp = New Matrix(m_Data, m_nCols, m_nRows)
For i = 0 To temp.m_nRows
For j = 0 To temp.m_nCols
temp.m_Data(i, j) /= _d
Next
Next
Return temp
End Function
#End Region
'palauttaa true, jos matriisi on identiteetti matriisi
Public Function IsIdentity() As Double
Dim i, j As Integer
If (m_nCols <> m_nRows) Then
Return False
End If
For i = 0 To m_nCols
For j = 0 To m_nRows
If i = j Then
If m_Data(i, j) <> 1.0 Then
Return False
End If
ElseIf i <> j Then
If m_Data(i, j) <> 0 Then
Return False
End If
End If
Next
Next
Return True
End Function
' Palauttaa true, jos jokainen alkio on tyhjä
Public Function IsEmpty() As Boolean
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
If m_Data(i, j) <> 0 Then Return False
Next
Next
Return True
End Function
' laskee matriisin determinantin
Public Function Determinant() As Double
If m_nRows <> m_nCols Then
MsgBox("Ei voi ottaa determinaattia muusta, kuin neliömatriisista")
Return Nothing
End If
Dim sum As Double = 0
If m_nRows = 1 Then
Return ((m_Data(0, 0) * m_Data(1, 1)) - (m_Data(1, 0) * m_Data(0, 1)))
Else
MsgBox("En osannut tehdä algoritmiä, joka pilkkoo matriisin alimatriiseihin ja laskee näin determinaatin. Se jääköön sinun tehtäväksesi. Live long and prosper.")
End If
End Function
#Region " Summaukset "
' Palauttaa kaikkien matriisin alkioiden summan
Public Function SumAll() As Double
Dim sum As Double = 0
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
sum += m_Data(i, j)
Next
Next
Return sum
End Function
' Laskee yhteen kaikkien matriisin alkioiden summan ja ottaa siitä neliön
Public Function SumAllSquared() As Double
Dim d As Double = SumAll()
Return (d * d)
End Function
' Summaa kaikki alkiot rivillä 'Row'
Public Function SumRow(ByVal Row As Integer) As Double
Dim j As Integer
Dim sum As Double = 0
For j = 0 To m_nCols
sum += m_Data(Row, j)
Next
Return sum
End Function
' Summaa kaikki alkiot sarakkeessa 'Col'
Public Function SumColumn(ByVal col As Integer) As Double
Dim i As Integer
Dim sum As Double = 0
For i = 0 To m_nRows
sum += m_Data(i, col)
Next
Return sum
End Function
' Laskee yhteen kaikkien rivin 'Row' alkioiden summan ja ottaa siitä neliön
Public Function SumRowSquared(ByVal Row As Integer) As Double
Dim d As Double = SumRow(Row)
Return (d * d)
End Function
' Laskee yhteen kaikkien sarakkeen 'Col' alkioiden summan ja ottaa siitä neliön
Public Function SumColumnSquared(ByVal Col As Integer) As Double
Dim d As Double = SumColumn(Col)
Return (d * d)
End Function
#End Region
#Region " Min/Max "
' Palauttaa matriisin suurimman arvon
Public Function GetMax() As Double
Dim i, j As Integer
Dim max As Double = m_Data(0, 0)
For i = 0 To m_nRows
For j = 0 To m_nCols
If m_Data(i, j) > max Then max = m_Data(i, j)
Next
Next
Return max
End Function
' Palauttaa matriisin pienimmän arvon
Public Function GetMin() As Double
Dim i, j As Integer
Dim min As Double = m_Data(0, 0)
For i = 0 To m_nRows
For j = 0 To m_nCols
If m_Data(i, j) < min Then min = m_Data(i, j)
Next
Next
Return min
End Function
' Palauttaa suurimman arvon matriisin rivillä 'Row'
Public Function GetRowMax(ByVal Row As Integer) As Double
Dim max As Double = m_Data(Row, 0)
Dim j As Integer
For j = 0 To m_nCols
If m_Data(Row, j) > max Then max = m_Data(Row, j)
Next
Return max
End Function
' Palauttaa piemimmän arvon matriisin rivillä 'Row'
Public Function GetRowMin(ByVal Row As Integer) As Double
Dim min As Double = m_Data(Row, 0)
Dim j As Integer
For j = 0 To m_nCols
If m_Data(Row, j) < min Then min = m_Data(Row, j)
Next
Return min
End Function
' Palauttaa suurimman arvon matriisin sarakkeessa 'Col'
Public Function GetColumnMax(ByVal Col As Integer) As Double
Dim max As Double = m_Data(0, Col)
Dim i As Integer
For i = 0 To m_nRows
If m_Data(i, Col) > max Then max = m_Data(i, Col)
Next
Return max
End Function
' Palauttaa pienimmän arvon matriisin sarakkeessa 'Col'
Public Function GetColumnMin(ByVal Col As Integer) As Double
Dim min As Double = m_Data(0, Col)
Dim i As Integer
For i = 0 To m_nRows
If m_Data(i, Col) < min Then min = m_Data(i, Col)
Next
Return min
End Function
#End Region
#Region " Ranget "
' Palauttaa pienimmän ja suurimman arvon erotuksen matriisissa
Public Function GetRange() As Double
Dim min, max As Double
GetNumericRange(min, max)
Return (max - min)
End Function
' Palauttaa pienimmän ja suurimman arvon erotuksen matriisin rivillä 'Row'
Public Function GetRowRange(ByVal Row As Integer) As Double
Dim min, max As Double
GetNumericRangeOfRow(min, max, Row)
Return (max - min)
End Function
' Palauttaa pienimmän ja suurimman arvon erotuksen matriisin sarakkeessa 'Col'
Public Function GetColumnRange(ByVal Col As Integer) As Double
Dim min, max As Double
GetNumericRangeOfColumn(min, max, Col)
Return (max - min)
End Function
#End Region
' Palauttaa matriisin yksiulotteisena taulukkona
Public Function GetDataOneDimen() As Double()
Dim i, j As Integer
Dim newData(m_nRows * m_nCols) As Double
For i = 0 To m_nRows
For j = 0 To m_nCols
newData((i * m_nRows) + j) = m_Data(i, j)
Next
Next
Return newData
End Function
' Plauttaa matriisin kaksiulotteisena taulukkona
Public Function GetDataTwoDimen() As Double(,)
Return m_Data
End Function
' Palauttaa rivien määrän
Public Function GetRows() As Integer
Return m_nRows
End Function
'palauttaa sarakkeiden määrän
Public Function GetColumns() As Integer
Return m_nCols
End Function
#Region " Tyhjennykset ja täytöt "
' Tyhjentää koko matriisin
Public Function Clear() As Matrix
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
m_Data(i, j) = 0
Next
Next
Return Me
End Function
' Tyhjentää matriisin rivin 'Row'
Public Function ClearRow(ByVal Row As Integer) As Matrix
Dim j As Integer
For j = 0 To m_nCols
m_Data(Row, j) = 0
Next
Return Me
End Function
' Tyhjentää matriisin sarakkeen 'Col'
Public Function ClearColumn(ByVal Col As Integer) As Matrix
Dim i As Integer
For i = 0 To m_nRows
m_Data(i, Col) = 0
Next
Return Me
End Function
' Täyttää koko matriisin luvulla _d
Public Function Fill(ByVal _d As Double) As Matrix
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
m_Data(i, j) = _d
Next
Next
Return Me
End Function
' Täyttää matriisista rivin 'Row' luvulla _d
Public Function FillRow(ByVal Row As Integer, ByVal _d As Double)
Dim j As Integer
For j = 0 To m_nCols
m_Data(Row, j) = _d
Next
Return Me
End Function
' Täyttää matriisista sarakkeen 'Col' luvulla _d
Public Function FillColumn(ByVal Col As Integer, ByVal _d As Double)
Dim i As Integer
For i = 0 To m_nRows
m_Data(i, Col) = _d
Next
Return Me
End Function
#End Region
' Palauttaa matriisin käänteisenä
Public Function GetInverse() As Matrix
If (m_nRows <> m_nCols) Then
MsgBox("Vain neliömatriisin voi muuttaa käänteiseksi")
Return Nothing
End If
Dim temp As Matrix
temp = Me
temp.RightAppendIdentity()
temp.RREF()
temp.LeftRemoveIdentity()
Return temp
End Function
' Muuta matriisi käänteiseksi
Public Function Invert() As Matrix
Me.m_Data = Me.GetInverse().m_Data
Return Me
End Function
#Region " peruslaksutoimitukset riveille ja sarakkeille "
' lisää 'SourceRow' 'DestRow':iin käyttäen 'factor' muuttujaa skaalaukseen
' Lue koodi, niin ymmärrät varmasti, mitä takoitan.
Public Function AddRows(ByVal SourceRow As Integer, ByVal DestRow As Integer, ByVal factor As Double) As Matrix
Dim j As Integer
For j = 0 To m_nCols
m_Data(DestRow, j) += (m_Data(SourceRow, j) * factor)
Next
Return Me
End Function
' kerro jokainen elementti rivistä 'Row' '_d':llä
Public Function MultiplyRow(ByVal Row As Integer, ByVal _d As Double) As Matrix
Dim j As Integer
For j = 0 To m_nCols
m_Data(Row, j) *= _d
Next
Return Me
End Function
' jaa jokainen elementti rivistä 'Row '_d':llä
Public Function DivideRow(ByVal Row As Integer, ByVal _d As Double) As Matrix
If (_d = 0) Then MsgBox("Ei voi jakaa nollalle(DivideRow)")
Dim j As Integer
For j = 0 To m_nCols
m_Data(Row, j) /= _d
Next
Return Me
End Function
' lisää 'SourceCol' 'DestCol':iin käyttäen 'factor' muuttujaa skaalaukseen
' Lue koodi, niin ymmärrät varmasti, mitä takoitan.
Public Function AddColumns(ByVal SourceCol As Integer, ByVal DestCol As Integer, ByVal factor As Double) As Matrix
Dim i As Integer
For i = 0 To m_nRows
m_Data(i, DestCol) += (m_Data(i, SourceCol) * factor)
Next
Return Me
End Function
' kerro jokainen elementti sarakkeesta 'Col' '_d':llä
Public Function MultiplyColumn(ByVal Col As Integer, ByVal _d As Double) As Matrix
Dim i As Integer
For i = 0 To m_nRows
m_Data(i, Col) *= _d
Next
Return Me
End Function
' jaa jokainen elementti sarakkeesta 'Col' '_d':llä
Public Function DivideColumn(ByVal Col As Integer, ByVal _d As Double) As Matrix
If (_d = 0) Then MsgBox("Ei voi jakaa nollalle(DivideColumn)")
Dim i As Integer
For i = 0 To m_nRows
m_Data(i, Col) /= _d
Next
Return Me
End Function
#End Region
' Muuttaa matriisin rivi echelon muotoon
Public Function REF() As Matrix
Dim i, j As Integer
For i = 0 To m_nRows
For j = i + 1 To m_nRows
AddRows(i, j, -m_Data(j, i) / m_Data(i, i))
Next
DivideRow(i, m_Data(i, i))
Next
Return Me
End Function
' Muuttaa matriisin rivi alennettuun echelon muotoon
Public Function RREF() As Matrix
REF()
Dim i, j As Integer
For i = m_nRows - 1 To 0 Step -1
For j = i - 1 To 0 Step -1
AddRows(i, j, -m_Data(j, i) / m_Data(i, i))
Next
DivideRow(i, m_Data(i, i))
Next
Return Me
End Function
' Palauttaa matrisiin rivi echelon muodon kuitenkaan muuttamatta matriisia siihen muotoon
Public Function GetREF() As Matrix
Dim temp As Matrix
temp = Me
temp.REF()
Return temp
End Function
' Palauttaa matrisiin alennetun rivi echelon muodon kuitenkaan muuttamatta matriisia siihen muotoon
Public Function GetRREF() As Matrix
Dim temp As Matrix
temp = Me
temp.RREF()
Return temp
End Function
' Palauttaa matriisin transposition
Public Function GetTransposed() As Matrix
Dim temp As Matrix
Dim i, j As Integer
temp = New Matrix(0.0, m_nCols, m_nRows)
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(j, i) = m_Data(i, j)
Next
Next
Return temp
End Function
' muuttaa matriisin transpositioon
Public Function Transpose() As Matrix
Me.m_Data = Me.GetTransposed().m_Data
Return Me
End Function
' asettaa 'Min':ksi pienimmän arvon matriisissa ja 'Max' suurimmaksi
Public Sub GetNumericRange(ByRef Min As Double, ByRef Max As Double)
Min = Max = m_Data(0, 0)
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
If (m_Data(i, j) < Min) Then Min = m_Data(i, j)
If (m_Data(i, j) > Max) Then Max = m_Data(i, j)
Next
Next
End Sub
' asettaa 'Min':ksi pienimmän arvon matriisin rivillä Row ja 'Max' suurimmaksi
Public Sub GetNumericRangeOfRow(ByRef Min As Double, ByRef Max As Double, ByVal Row As Integer)
Dim j As Integer
Min = Max = m_Data(row, 0)
For j = 0 To m_nCols
If (m_Data(row, j) > Max) Then Max = m_Data(row, j)
If (m_Data(row, j) < Min) Then Min = m_Data(row, j)
Next
End Sub
' asettaa 'Min':ksi pienimmän arvon matriisin sarakkeella Col ja 'Max' suurimmaksi
Public Sub GetNumericRangeOfColumn(ByRef Min As Double, ByRef Max As Double, ByVal Col As Integer)
Dim i As Integer
Min = Max = m_Data(0, Col)
For i = 0 To m_nRows
If (m_Data(i, Col) > Max) Then Max = m_Data(i, Col)
If (m_Data(i, Col) < Min) Then Min = m_Data(i, Col)
Next
End Sub
'CMAR = liitosta Matriisi Riveinä(Concatenate Matrix As Rows)
' Liitostaa matriisin 'obj' oikealle matriisiin
Public Function CMAR(ByVal obj As Matrix) As Matrix
If (m_nCols <> obj.m_nCols) Then MsgBox("Epäyhteensopivat matriisikoot")
Dim temp As New Matrix(0.0, (m_nRows + obj.m_nRows), m_nCols)
Dim i, j, k As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j)
Next
Next
k = 0
For i = i To temp.m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = obj.m_Data(k, j)
Next
k += 1
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' CMAC = liitosta Matriisi Sarakkeina(Concatenate Matrix As Columns)
' Liitostaa matriisin 'obj' alas matriisiin
Public Function CMAC(ByVal obj As Matrix) As Matrix
If (m_nRows <> obj.m_nRows) Then MsgBox("Epäyhteensopivat matriisikoot")
Dim temp As New Matrix(0.0, m_nRows, (m_nCols + obj.m_nCols))
Dim i, j, l As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j)
Next
For l = 0 To obj.m_nCols
temp.m_Data(i, j) = obj.m_Data(i, l)
j += 1
Next
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
'CMAR = liitosta Matriisi Riveinä(Concatenate Matrix As Rows)
'Palauttaa kopion matriisista, johon on oikealle liitostettu matriisi 'obj'
Public Function GetCMAR(ByVal obj As Matrix)
Dim temp As Matrix
temp = Me
temp.CMAR(obj)
Return temp
End Function
'CMAC = liitosta Matriisi sarakkeina(Concatenate Matrix As Columns)
'Palauttaa kopion matriisista, johon on alhaalle liitostettu matriisi 'obj'
Public Function GetCMAC(ByVal obj As Matrix)
Dim temp As Matrix
temp = Me
temp.CMAC(obj)
Return temp
End Function
' lisää matriisiin rivi oikealle, datalla RowData
Public Function ConcatenateRow(ByVal RowData() As Double) As Matrix
Dim temp As New Matrix(0.0, m_nRows + 1, m_nCols)
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j)
Next
Next
i = m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = RowData(j)
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' lisää matriisiin sarake alas, datalla ColumnData
Public Function ConcatenateColumn(ByVal ColumnData() As Double) As Matrix
Dim temp As New Matrix(0.0, m_nRows, m_nCols + 1)
Dim i, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
temp.m_Data(i, j) = m_Data(i, j)
Next
Next
j = m_nCols
For i = 0 To m_nRows
temp.m_Data(i, j) = ColumnData(i)
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' Lisää rivi kohtaan 'RowSpot'
Public Function SpliceInRow(ByVal RowData() As Double, ByVal RowSpot As Integer)
Dim temp As New Matrix(0.0, m_nRows + 1, m_nCols)
Dim i, k, j As Integer
For i = 0 To m_nRows
If i = RowSpot Then
For j = 0 To m_nCols
temp.m_Data(i, j) = RowData(j)
Next
k += 1
End If
For j = 0 To m_nCols
temp.m_Data(k, j) = m_Data(i, j)
Next
k += 1
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' Lisää sarake kohtaan 'ColumnSpot'
Public Function SpliceInColumn(ByVal ColumnData() As Double, ByVal ColumnSpot As Integer)
Dim temp As New Matrix(0.0, m_nRows, m_nCols + 1)
Dim i, l, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
If (j = ColumnSpot) Then
temp.m_Data(i, l) = ColumnData(i)
l += 1
End If
temp.m_Data(i, l) = m_Data(i, j)
l += 1
Next
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' poistaa kyseisen rivin matriisista
Public Function RemoveRow(ByVal Row As Integer) As Matrix
Dim temp As New Matrix(0.0, m_nRows - 1, m_nCols)
Dim i, k, j As Integer
For i = 0 To m_nRows
If (i = Row) Then i += 1
For j = 0 To m_nCols
temp.m_Data(k, j) = m_Data(i, j)
Next
k += 1
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' poistaa kyseisen sarakkeen matriisista
Public Function RemoveColumn(ByVal Column As Integer) As Matrix
Dim temp As New Matrix(0.0, m_nRows - 1, m_nCols)
Dim i, l, j As Integer
For i = 0 To m_nRows
For j = 0 To m_nCols
If (j = Column) Then j += 1
temp.m_Data(i, l) = m_Data(i, j)
l += 1
Next
Next
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' Järjestää matriisin nousevaan järjestykseen
Public Function SortAscend() As Matrix
Dim Data() As Double = GetDataOneDimen()
Dim length As Integer = m_nRows * m_nCols
Dim temp As Double
Dim i, j As Integer
For i = 0 To length
For j = 0 To length - 1
If Data(j) > Data(j + 1) Then
temp = Data(j)
Data(j) = Data(j + 1)
Data(j + 1) = temp
End If
Next
Next
Dim t As Matrix = New Matrix(Data, m_nRows, m_nCols)
Me.m_Data = t.m_Data
Return Me
End Function
' Järjestää matriisin laskevaan järjestykseen
Public Function SortDescend() As Matrix
Dim Data() As Double = GetDataOneDimen()
Dim length As Integer = m_nRows * m_nCols
Dim temp As Double
Dim i, j As Integer
For i = 0 To length
For j = 0 To length - 1
If Data(j) < Data(j + 1) Then
temp = Data(j)
Data(j) = Data(j + 1)
Data(j + 1) = temp
End If
Next
Next
Dim t As Matrix = New Matrix(Data, m_nRows, m_nCols)
Me.m_Data = t.m_Data
Return Me
End Function
' Palauttaa matriisin skaalattuna minin ja maxin väliin(kuitenkaan itse matrisiia muuttamatta)
Public Function GetNormalized(ByVal Min As Double, ByVal Max As Double)
Dim temp As Matrix
temp = Me
temp.Normalize(Min, Max)
Return temp
End Function
' Skaalaa matriisin minin ja maxin väliin
Public Function Normalize(ByVal Min As Double, ByVal Max As Double) As Matrix
Dim i, j As Integer
Dim MatMin, MatMax As Double
Dim Range, R_Range As Double
GetNumericRange(MatMin, MatMax)
Range = MatMax - MatMin
R_Range = Max - Min
For i = 0 To m_nRows
For j = 0 To m_nCols
m_Data(i, j) -= MatMin
m_Data(i, j) /= Range
m_Data(i, j) *= R_Range
m_Data(i, j) += Min
Next
Next
Return Me
End Function
' Palauttaa matriisin kovariantiksti (transposoitu obj * obj)
Public Function GetCovariant() As Matrix
Dim temp As Matrix
temp = Me
temp.Transpose()
Return Me.Multiply(temp)
End Function
' muuttaa matriisin kovariantiksi
Public Function MakeCovariant() As Matrix
Dim temp As Matrix
temp = Me
temp = temp.GetCovariant
Me.m_Data = temp.m_Data
Me.m_nCols = temp.m_nCols
Me.m_nRows = temp.m_nRows
Return Me
End Function
' palauttaa identiteetti matriisin kokoa 'koko'
Public Shared Function IdentityMatrix(ByVal koko As Integer) As Matrix
Dim temp As Matrix
temp = New Matrix(0.0, koko, koko)
Dim q As Integer
For q = 0 To koko
temp.m_Data(q, q) = 1
Next
Return temp
End Function
End ClassMatriisin determinantin laskemiseksi matriisia ei tarvitse pilkkoa alimatriiseiksi, vaan sen voi muuttaa elementaarimuunnoksilla kanoniseen muotoon ja laskea determinantin sen avulla.
Meni hieman liian monimutkaiseksi. :D
Niin ja kondirmoitunu inderfemtiaaliyksikkö voi olla kaiken lisäksi myös generoitu renderöidyllä opessionaalipisteellä vaikka se onkin luonut finderöidyn eksplosion (Älkää valittako)
Sami kirjoitti:
Matriisin determinantin laskemiseksi matriisia ei tarvitse pilkkoa alimatriiseiksi, vaan sen voi muuttaa elementaarimuunnoksilla kanoniseen muotoon ja laskea determinantin sen avulla.
Gwaur kirjoitti:
Niin ja kondirmoitunu inderfemtiaaliyksikkö voi olla kaiken lisäksi myös generoitu renderöidyllä opessionaalipisteellä vaikka se onkin luonut finderöidyn eksplosion
ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ :DDD Ihan hepreaa mulle... meni _HIEMAN_ liian monimutkaiseksi :P
lainaus:
Niin ja kondirmoitunu inderfemtiaaliyksikkö voi olla kaiken lisäksi myös generoitu renderöidyllä opessionaalipisteellä vaikka se onkin luonut finderöidyn eksplosion (Älkää valittako)
No hei, ehkä tämä kirjasto onkin tarkoitettu niille, jotka tietävät enemmän matriiseista ja yleensäkin matematiikasta. Jos ei ymmärrä, on turha antaa kommenttia. (varsinkaan huonoa) Minäkään en mitenkään erityisen paljon tiedä, mutta siitä, minkä ymmärsin, voin sanoa, että kyllä tuosta varmasti alan harrastajille hyötyä on. Sami ilmeisesti ymmärtää jotain asian päälle. Gwaurista en olisi ihan niin varma. :D
aika pitkä
lainaus:
Niin ja kondirmoitunu inderfemtiaaliyksikkö voi olla kaiken lisäksi myös generoitu renderöidyllä opessionaalipisteellä vaikka se onkin luonut finderöidyn eksplosion (Älkää valittako)
En mäkään ymmärrä tosta mitään mut toi onki varmaan semmosta hassuu enkkusuomee, eli esim. Configuration => Konfiguraatio ku se on oikeesti jotain säätöö :D