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 Class
Matriisin 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