Avatar billede jake_2 Nybegynder
02. juli 2003 - 21:36 Der er 23 kommentarer og
1 løsning

Kan man bruge matricer i VB

Jeg har brug for en række matrice operationer, såsom invertering prik osv.  Nogen der kan fortælle mig hvordan dette gøres i VB
Avatar billede bufferzone Praktikant
02. juli 2003 - 22:55 #1
Ja det kan du godt, jeg er ikke selv den store VB haj, men prøv at se denne tut, måske kan du tage udgangspunkt i de beskrivelser der her findes

http://www.vb-helper.com/tut4.htm
Avatar billede bufferzone Praktikant
02. juli 2003 - 22:59 #2
Avatar billede jake_2 Nybegynder
03. juli 2003 - 08:34 #3
Desværre er der ikke noget her omkring invertering.
Avatar billede arne_v Ekspert
03. juli 2003 - 08:41 #4
Altså et 2 dimensionelt array er jo en matrice.

Invers bliver du vel så nødt til selv at kode, men det er jo
ikke så svært.
Avatar billede jake_2 Nybegynder
03. juli 2003 - 09:01 #5
Det har du bestemt ikke ret i. At invertere en matrice er ikke lige til og ikke noget man bare lige koder. ( Ihvertfald hvad jeg husker fra matematisk analyse 3)
Avatar billede arne_v Ekspert
03. juli 2003 - 09:14 #6
Der er en O(n^3) operation.

Med store matricer eller matricer med "uheldige" egenskaber kan
der være stor regne-unøjagtighed.

Men indtil du konstaterer at det er et problem, så ville jeg
bare prøve med en "normal procedure".

Og det er naturligvis ikke determinant formlen, men den hvor man
laver række operationer på A I jeg tænker på.

Hvis det viser sig at der er for stor regne unøjagtighed ved den, så
er der lavet forskellige dekomponerings metoder til at hjælpe.

Alt det er opfundet for 20-40 år siden og er kendt teknologi.

Hvis du vil kan jeg godt prøve at lave en inv i VB. Men det bliver først
i aften.
Avatar billede martin_moth Mester
03. juli 2003 - 13:48 #7
Det ville jo være oplagt at bruge et andet program end VB til at håndtere vektorer og matricer - fx. Matlab (der jo er som skabt til det), Matcad osv. Hvis det kan være en løsning at bruge et andet program, er der også shareware, fx. http://members.xoom.virgilio.it/lis/einin.html

VB kan IKKE som standard håndterer macricer. Men måske er der allerede skrevet fx. et classmodule, der kan - men har ikke kunne finde noget på nettet :o(
Avatar billede martin_moth Mester
03. juli 2003 - 13:53 #8
He he - det lykkedes alligevel :-D


Kik efter noget der hedder "MatrixVB" på diverse søgemaskiner

Det fører f.eks. til denne adresse, men også til andre hvorfra der kan downloades

www.mathworks.com/r12products/matrixvb/
Avatar billede martin_moth Mester
03. juli 2003 - 13:56 #9
Du KAn downloade en 30 day trail fra www.mathworks.com/r12products/matrixvb/tryit.shtml

Men du kan garanteret finde et download uden begrænsning...
Avatar billede nmh Nybegynder
30. juli 2003 - 15:23 #10
Dette er godt nok VB.net, men burde vel kunne omskrives til VB?

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=907&lngWId=10
Avatar billede nmh Nybegynder
30. juli 2003 - 16:05 #11
Her det samme i VB. Måske skal du tilmelde dig? Jeg havde lidt problemer med den forrige henvisning.

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=31466&lngWId=1
Avatar billede nmh Nybegynder
30. juli 2003 - 16:22 #12
Her er en procedure fra ovennævnte henvisning:
Public Function MatrixInv(a As Variant) As Variant
On Error GoTo errHandler
s = MatrixDet(a)
If IsNull(s) Then GoTo errHandler
If s = 0 Then
    MatrixInv = Null
    Exit Function
End If
lb = LBound(a)
ub = UBound(a)
ReDim IA(lb To ub, lb To ub) As Variant
ReDim sm(lb To ub - 1, lb To ub - 1) As Variant

For v = lb To ub
    For w = lb To ub
    le = 0
            For x = lb To ub - 1
                ce = 0
                For y = lb To ub - 1
                    If v = x Then le = 1
                    If y = w Then ce = 1
                    sm(x, y) = a(x + le, y + ce)
                Next y
            Next x
        IA(w, v) = (-1) ^ (w + v) * MatrixDet(sm) / s
    Next w
Next v
MatrixInv = IA()
Exit Function
errHandler:
MatrixInv = Null
Exit Function
End Function
Avatar billede nmh Nybegynder
30. juli 2003 - 16:29 #13
Du får dog også brug for at kunne udregne determinanten af en matrix. Det sker her: (igen fra ovenstående henvisning)

Public Function MatrixDet(ByVal a As Variant) As Variant
On Error GoTo errH
lb = LBound(a)
ub = UBound(a)
MatrixDet = 1
For i = lb To ub - 1
If a(i, i) = 0 Then
FGOS = 0
    For L = i + 1 To ub
    If a(L, i) <> 0 Then
            For M = lb To ub
            Q = a(L, M)
            a(L, M) = a(i, M)
            a(i, M) = Q
            Next M
            MatrixDet = -MatrixDet
            FGOS = -1
            Exit For  'L'
    End If
    Next L
    If FGOS <> -1 Then MatrixDet = 0
End If
If MatrixDet = 0 Then Exit Function
For j = i + 1 To ub
t = a(i, j) / a(i, i)
For k = lb To ub
a(k, j) = a(k, j) - a(k, i) * t
Next k
Next j
Next i
For i = lb To ub
MatrixDet = MatrixDet * a(i, i)
Next i
Exit Function
errH:
MatrixDet = Null
Exit Function
End Function
Avatar billede nmh Nybegynder
30. juli 2003 - 16:33 #14
Sørg for at download zip-filen første gang. Efter at have besøgt stedet et par gange kræves der tilmelding, men det er som sagt gratis.
Avatar billede arne_v Ekspert
30. juli 2003 - 21:28 #15
Den kode bruger Cramer.

Det er båd en langsom metod eog en metode med stor regne unøjagtighed.

Gaussisk elimination er både hurtigere og mere nøjagtig.
Avatar billede nmh Nybegynder
30. juli 2003 - 21:43 #16
Arne-V-->Du har helt ret, men for små matricer vil det  være brugbart, hvis determinanten ikke er tæt på 0, og jeg har ikke kunnet finde andet, der er gratis. Det er jo lidt besværligt lave det ordentligt.
Avatar billede arne_v Ekspert
30. juli 2003 - 21:51 #17
Det burde ikke tage mere end 30-50 linier at lave det med Gaussisk
elimination.
Avatar billede nmh Nybegynder
30. juli 2003 - 21:59 #18
Gaussisk eliminination vil være langt hurtigere, men opgaven i sig selv bliver problematisk, hvis matricen er på nippet til ikke at være invertibel.
Avatar billede arne_v Ekspert
30. juli 2003 - 22:04 #19
Gaussisk elimination vil så vidt jeg ved altid være bedre end Cramer.

Hvis matricen er rigtig grim kan man f.eks. lave LU dekomponering.
Avatar billede nmh Nybegynder
30. juli 2003 - 22:08 #20
LU dekomponering kender jeg ikke til, men det korte af det lange er at problemét at invertere matricer ikke er helt nemt at løse ordentligt.
Avatar billede arne_v Ekspert
30. juli 2003 - 22:15 #21
LU er bare en dekomponering i 2 matrixer ligesom QR (og ligesom SVD er i 3).

Efter min bedste overbevisning er regne unøjagtigheds problemerne ved
matrix invertering stærkt overdrevet.

Gaussisk elimination i double precision går godt i de fleste
tilfælde selv med halv store matricer.

Der er selvfølgelig undtagelser.
Avatar billede jakob_madsen Nybegynder
31. juli 2003 - 08:56 #22
Jeg har fundet og købt noget som hedder MKL. Hvilket fungere fint med c jeg har lavet en række bas filer og det fungere nu. Tak for hjælpen.
Avatar billede arne_v Ekspert
31. juli 2003 - 09:09 #23
jake 2 = jakob madsen ?
Avatar billede nmh Nybegynder
31. juli 2003 - 10:38 #24
Så skulle du have lukket spørgsmålet forlængst. Jeg brugte da lidt tid på at prøve at besvare det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester