Source/ Codesnippets | | | | p.specht
| cette traditionelle Algorithmus ist seulement chez plutôt voll belegten Matrizen sinnvoll. Pour sogenannte 'Sparse Matrices' (schwach - meist entlang qui tête- ou bien Nebendiagonale besetzte Matrizen; solche treten insb. im Bereich Finite Elemente Methode chez Statikberechnungen sur) gibt es schnellere Methoden.
' Traditionelle Matrixmultiplikation V1.3beta (Demo by P.Specht. seulement trop Timingzwecken gedacht!)
' ICI GEWÜNSCHTE TESTDIMENSIONEN EINGEBEN:
' Zeilen,Spalten de A / Gestürzte Spalten s&, gestürzte Zeilen t& de B
var z&= 1000 : var s&= 100 : var t&= 100
' Vorbereitung
Titre de la fenêtre "Traditionelle Matrixmultiplikation (seulement pour Timingzwecke)"
Font 2:@Set("RandSeed",10):Cls rnd(8^8)
set("Décimal",18)
Déclarer A![z&,s&],B![s&,t&],C![z&,t&],i&,j&,k&,w!,tm&,a$
' Matrix A traditionell avec Zufallswerten <> 0 belegen
Imprimer " Erforderlicher Speicherplatz: ";int(((z&*s&+s&*t&+z&*t&)*8));" Byte"
Imprimer " Matrix-Zufallsbelegung..."
tm&=&GetTickCount
i&=1:Tandis que i&<=z&
j&=1:Tandis que j&<=s&
w!=(50000000-rnd(100000000))/rnd(50000000)+1
A![i&,j&]=w!
inc j&:Endwhile
inc i&:Endwhile
tm&=&GetTickCount-tm&
Imprimer " Matrix A ("+str$(int(s&*z&))+" Elemente) traditionell belegt dans "+str$(tm&)+" ms."
' &Index ici genullt, là il seulement comme schnelle Boucle nécessaire wird:
tm&=&GetTickCount
b![]=rnd(99999+0*&index)+1
tm&=&GetTickCount-tm&
Imprimer " Matrix B ("+str$(int(s&*t&))+" Elemente) Highspeed-zufallsbelegt dans "+str$(tm&)+" ms."
' Possibilité zur Überprüfung qui Matrixfunktion à main einfacher Matrizen:
Si 0' Funktionstest 0 = Off , 1 = ON
z&=2 : s&=2 : t&=2
' Matrix A =
A![1,1]=2 : A![1,2]=0
A![2,1]=0 : A![2,2]=1
' Matrix B =
B![1,1]=2 : B![1,2]=0
B![2,1]=0 : B![2,2]=1
Endif
Imprimer " qui Matrizen sommes verlinkt dans Breite "+str$(s&)+" A-Spalten=B-Zeilen."
Beep
Imprimer " ";int(z&*s&*t&);" Multiplikationen et Additionen erforderlich."
imprimer "\n Zum Start qui Matrixmultiplikation bouton drücken!"
SetTimer 12000 : WaitInput : killtimer
Imprimer "\n Berechnung qui "+str$(int(z&*t&))+" Elemente de C fonctionne."
Imprimer " un Punkt steht jeweils pour "+str$(int(t&))+" fertige Elemente."
imprimer " cela wird ca. "+str$(int(z&/61+1))+" Zeilen besoin."
' Traditionelle Matrixmultiplikation
tm&=&GetTickCount
W!=0
i&=1:Tandis que i&<=z&
k&=1:Tandis que k&<=t&
w!=0
j&=1:Tandis que j&<=s&
w!=w!+A![i&,j&]*B![j&,k&]
inc j&:Endwhile
C![i&,k&]=w!
inc k&:Endwhile
imprimer ".";
cas %pos>61:imprimer
cas %csrlin>22:cls
inc i&:Endwhile:imprimer
tm&=&GetTickCount-tm&
Beep
Imprimer " 2 Matrizen multipliziert dans "+ si( tm& > 9000 , str$(tm&\1000)+" sec." ,str$(tm&)+" ms." )
Imprimer "\n Ergebnis C ausgeben?"
WaitInput
cas IsKey(27):end
cas IsKey(78):end
' Ausgabe qui Ergebnis-Matrix C
CLS
tm&=&GetTickCount
i&=1:Tandis que i&<=z&
imprimer "********* la ligne "+$ Trim(str$(i&))+" de "+$ Trim(str$(z&))+": *********"
k&=1:Tandis que k&<=t&
si %csrlin>22:SetTimer 700: WaitInput :Killtimer:cls:endif
Imprimer "S"+$ Trim(str$(k&))+»+format$("%e",C![i&,k&]),
cas %pos > 50:imprimer
inc k&:Endwhile :imprimer
inc i&:Endwhile
tm&=&GetTickCount-tm&
Imprimer "\n Matrix C ausgegeben dans " + si( tm& > 9000 , str$(tm&\1000)+" sec." , str$(tm&)+" ms." )
WaitInput
Fin
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 17.04.2021 ▲ |
| |
| | p.specht
| avec Assembler (XPSE) beschleunigt Benchmark 1; a[100x100] * b[100x10]: Interpreter 81.256 s / ProfComp: 23.565 s / XPSE-nProc: 0.234 s Benchmark 2: a[1000x1000] * b[1000x400]: Interp: 6h 22min / ProfComp: 2481.222 s / XPSE-nProc: 116.02 s
Titre de la fenêtre "Beschleunigte Matrixmultiplikation"
' (CL) Copyleft 2012-09 P.Specht(at)gmx.at
si 0
$DEFINE XPSE
$IFDEF xpse
{$cleq}
$ENDIF
endif
Windowstyle 1048
window 0,0-%maxx,%maxy
randomize
font 2
cls rnd(8^8)
set("decimals",15)
set("numwidth",27)
declare z&,s&,t&,i&,j&,k&,status&
z&=100
s&=100
t&=100
dec z&:dec s&:dec t&
declare a![z&,s&],b![s&,t&],c![z&,t&]
whileLoop 0,s&
a![&Boucle,&Boucle]=-1
endwhile
status&=show(z&,s&,a![]):imprimer
b![]=rnd(1000)*10^(rnd(5)*(1-2*rnd(2)))
status&=show(s&,t&,b![]):imprimer
var tm&=&GetTickCount
status&=Multipli(z&,s&,t&,addr(a![0,0]),addr(b![0,0]),addr(c![0,0]))
tm&=&GetTickCount-tm&
status&=show(s&,t&,c![]):imprimer
imprimer tm&/1000,"sec.\nREADY."
Waitinput
Fin
proc show
parameters u&,v&,m![]
si u&>5
imprimer u&+1;" Werte pro Zeile"
d'autre
declare mm!
whileloop 0,u&:i&=&Boucle
whileloop 0,v&:j&=&Boucle
mm!=m![i&,j&]
'si (mm!<10^10) and (mm!>10^-11) and (mm!<>0)
imprimer m![i&,j&],
'd'autre : imprimer format$("%e",m![i&,j&]), : endif
endwhile
imprimer
si %csrlin>30:waitinput:cls rnd(8^8):endif
endwhile
imprimer
endif
return 1
endproc
$IFDEF xpse
NProc Multipli
parameters z&,s&,t&,a_&,b_&,c_&
declare sum!,prod!,aa!,bb!,cc!,i&,j&,k&
WhileLoop 0,z&:i&=&Boucle
WhileLoop 0,t&:k&=&Boucle
sum!=0.0
WhileLoop 0,s&:j&=&Boucle
aa!=getfloat(a_&,8*(i&+(z&+1)*j&))
bb!=getfloat(b_&,8*(j&+(s&+1)*k&))
prod!=aa!*bb!
sum!=sum!+prod!
endwhile
setfloat(c_&,8*(i&+(s&+1)*k&),sum!)
endwhile
endwhile
return 0
endproc
$ENDIF
'Proc Multipli
'parameters z&,s&,t&,a_&,b_&,c_&
'declare sum!,prod!,aa!,bb!,cc!,i&,j&,k&
'WhileLoop 0,z&
'i&=&Loop
'WhileLoop 0,t&
'k&=&Loop
'sum!=0
'WhileLoop 0,s&
'j&=&Loop
'sum!=sum!+a![i&,j&]*b![j&,k&]
'endwhile
'c![i&,k&]=sum!
'endwhile
'locate 2,2:imprimer bordure$(str$(i&));
'endwhile
'return 0
'endproc
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 07.05.2021 ▲ |
| |
|
Zum QuelltextOptions du sujet | 729 Views |
Themeninformationencet Thema hat 1 participant: |