Kirjautuminen

Haku

Tehtävät

Koodit: VB.NET: Dynaaminen matriisikirjasto

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

Kommentit

Sami [09.05.2004 20:02:31]

#

Matriisin determinantin laskemiseksi matriisia ei tarvitse pilkkoa alimatriiseiksi, vaan sen voi muuttaa elementaarimuunnoksilla kanoniseen muotoon ja laskea determinantin sen avulla.

peki [09.05.2004 20:42:44]

#

Meni hieman liian monimutkaiseksi. :D

Gwaur [09.05.2004 22:13:16]

#

Niin ja kondirmoitunu inderfemtiaaliyksikkö voi olla kaiken lisäksi myös generoitu renderöidyllä opessionaalipisteellä vaikka se onkin luonut finderöidyn eksplosion (Älkää valittako)

sooda [11.05.2004 18:59:26]

#

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

hunajavohveli [21.05.2004 20:51:31]

#

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

thekoodaaja [07.09.2004 18:58:03]

#

aika pitkä

miiro [08.01.2006 18:53:45]

#

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

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta