Malkey Posted February 5, 2008 Share Posted February 5, 2008 (edited) In an attempt to combine the command line calculator found @a simple calculator function, sin, cos, powers, brackets etcwith the matrix calculator found @Matrix Calculator (Autosize, floating matrix windows)The result is as follows:-Edit: Up to 9Nov2008 File CmdLineCalc.au3 ( 62.58K ) Number of downloads: 58Removed file and pasted script.expandcollapse popup#include <GUIConstants.au3> #include <GuiEdit.au3> #include <ButtonConstants.au3> #include <WindowsConstants.au3> ; http://www.autoitscript.com/forum/index.php?s=&showtopic=63635&view=findpost&p=474934 ;======= From matrixUDF.au3 file @ bottom ============ Global $iDF = 0 ; use to calculate determinantand used in Upper Triangle calculations. sign of submatrices Global $setdecplac, $decplInput1, $decplaceval = 0 ;================================================ Global Const $WM_LBUTTONDOWN = 0x0201 ; Drag Window 1 of 3 addin Dim $matrix1, $newm1, $RandMat1, $menu1, $openf1, $saveas1, $separator1, $filexit1, $Matname1 = "Untitled" ;Gui matrix1 Dim $matrix2, $newm2, $RandMat2, $menu2, $openf2, $saveas2, $filexit2, $Matname2 = "Untitled" ;Gui matrix2 Dim $matrix3, $newm3, $RandMat3, $menu3, $openf3, $saveas3, $filexit3, $Matname3 = "Untitled" ;Gui matrix3 Dim $Run1[1072],$Run2[630],$Run3[630], $opos = 0, $matrix1, $matrix2, $matrix3 ; dispmat func variables Dim $filename,$w2, $h3 Dim $m1[5][5] = [[ 3, 2, -1, 3, 4], [1, 6, 3, 3, 1], [2, -4, 0, 3, 9 ],[2, 3, 9, 12, 3],[4, 2, 8, 5, 1]] ;Gui matrix1 Dim $m2[3][3] = [[ 3, 2, -1], [1, 6, 3], [2, -4, 0]] ;Gui matrix2 Dim $m3[3][3] = [[ 0, 0, 0], [0, 0, 0], [0, 0, 0]] ;Gui matrix3 Const $pi = 4*atan(1) , $pifactor = $pi/180 ; Command line varables Global $stringtocalc,$splitcalc,$pp, $temg, $tempm, $mf = 0, $mr = 0 ; Command line varables Dim $string, $linButok, $linButcan, $commandInput, $mainfrm , $lineEdit ; Command line varables Opt("GUIResizeMode", 802) ; Very important to get the right size GUICtrlCreateInput Opt("PixelCoordMode", 2) Opt("WinTitleMatchMode", 3) HotKeySet("{Enter}", "enterkey") matrix1gui() matrix2gui() matrix3gui() Commandline() GuiRegisterMsg($WM_LBUTTONDOWN, "_WinMove") ; Drag Window 2 of 3 addin While 1 If GetHoveredHwnd() = $matrix1 Then ToolTip("Matrix1 is "& $Matname1) ElseIf GetHoveredHwnd() = $matrix2 Then ToolTip("Matrix2 is "& $Matname2) ElseIf GetHoveredHwnd() = $matrix3 Then ToolTip("Matrix3 is "& $Matname3) Else ToolTip("") EndIf $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $filexit1, $filexit2, $filexit3, $linButcan $no = MsgBox(4, "Exit Matrix Manipulation?", " If you wish to continue and save matrix (matrices), press No " & @CRLF & @CRLF & " To Exit, press Yes.") if $no = 6 then ExitLoop ;-------------------------------- Matrix 1 Menu ------------- ;Case $loadcal1, $loadcal2, $loadcal3 ;Calculator ; ShellExecute("Calc.exe") Case $newm1 $n = NewMatrix("Matrix 1") if $n <> 1 then $m1 = $n ;MsgBox(0,"",$m1[0][0] & " " & $m1[0][1]) dispmat("Matrix 1", $m1) $Matname1 = $filename EndIf Case $openf1 $n = fileop() if $n <> 1 then $m1 = $n dispmat("Matrix 1", $m1) $Matname1 = $filename EndIf Case $saveas1 $m1 = refreshmat($m1, "Matrix 1") $n = savemat("Matrix 1", $m1) if $n <>1 then $Matname1 = $filename EndIf Case $RandMat1 ;$oldfname = $Matname1 $m1 = refreshmat($m1, "Matrix 1") $m1 = RandomizeMatrixData($m1) dispmat("Matrix 1", $m1) $Matname1 = "Untitled" ;--------------------------> End of Matrix 1 Menu ------------- Case $newm2 $n = NewMatrix("Matrix 2") if $n <> 1 then $m2 = $n ;MsgBox(0,"",$m2[0][0] & " " & $m2[0][2]) dispmat("Matrix 2", $m2) $Matname2 = $filename EndIf Case $openf2 $n = fileop() if $n <> 1 then $m2 = $n dispmat("Matrix 2", $m2) $Matname2 = $filename EndIf Case $saveas2 $m2 = refreshmat($m2, "Matrix 2") $n = savemat("Matrix 2", $m2) if $n <>2 then $Matname2 = $filename EndIf Case $RandMat2 ;$oldfname = $Matname2 $m2 = refreshmat($m2, "Matrix 2") $m2 = RandomizeMatrixData($m2) dispmat("Matrix 2", $m2) $Matname2 = "Untitled" ;-----------------------------> End of Matrix 2 Menu ------------- Case $newm3 $n = NewMatrix("Matrix 3") if $n <> 1 then $m3 = $n ;MsgBox(0,"",$m3[0][0] & " " & $m3[0][3]) dispmat("Matrix 3", $m3) $Matname3 = $filename EndIf Case $openf3 $n = fileop() if $n <> 1 then $m3 = $n dispmat("Matrix 3", $m3) $Matname3 = $filename EndIf Case $saveas3 $m3 = refreshmat($m3, "Matrix 3") $n = savemat("Matrix 3", $m3) if $n <>3 then $Matname3 = $filename EndIf Case $RandMat3 ;$oldfname = $Matname3 $m3 = refreshmat($m3, "Matrix 3") $m3 = RandomizeMatrixData($m3) dispmat("Matrix 3", $m3) $Matname3 = "Untitled" ;---------------------------------> End of Matrix 3 Menu ------------- Case $linButok $string = GUICtrlRead ($commandInput) ;If $string = '' Then Exit $string = StringStripWS($string,8) $string = StringUpper($string) consolewrite(' @start $string =' & $string & " str lngth- 2 = "& (StringLen($string)-2) & @CR) if StringInStr ($string,"=") = (StringLen($string)-2) Then $mr = StringRight($string,2) $string = StringMid($string,1,StringLen($string)-3) consolewrite(' @start2nd $string =' & $string & ' $mr =' & expandabbrev($mr) & @CR) EndIf If StringRight($string,1) = '=' Then $string = StringMid($string,1,StringLen($string)-1) EndIf $m1 = refreshmat($m1, "Matrix 1") $m2 = refreshmat($m2, "Matrix 2") $m3 = refreshmat($m3, "Matrix 3") consolewrite(' sent $string =' & $string & @CR) $answ = calculate($string) consolewrite('IsArray($answ) =' & IsArray($answ) & ' ($answ) =' & ($answ) & @CR) If IsArray($answ) then If $mr = "" then $mr = SelMatRslt() If $mr <> "0" then If $mf = 2 Then $decplaceval = 8 if $mf >= 1 Then If expandabbrev($mr) = "Matrix 1" Then $m1 = $answ ;$tempm dispmat(expandabbrev($mr),$m1) ElseIf expandabbrev($mr) = "Matrix 2" Then $m2 = $answ ;$tempm dispmat(expandabbrev($mr),$m2) ElseIf expandabbrev($mr) = "Matrix 3" Then $m3 = $answ ;$tempm dispmat(expandabbrev($mr),$m3) EndIf EndIf EndIf else MsgBox(0,$string & ' = ',$answ) EndIf If $mf = 2 Then $decplaceval = 0 GUICtrlSetData ( $commandInput, "") $string = "" $tempm = "" $mr = "" $mf = 0 GUICtrlSetState ($lineEdit, $GUI_FOCUS) EndSwitch WEnd ; ========== Martix 1 GUI window ========== Func matrix1gui() $matrix1 = GuiCreate( "Matrix1",540, 200, @DesktopWidth * 0.1, 20, Default, Default) ;, $WS_EX_TOOLWINDOW ) GUISetBkColor(0xA6CAF0) ;==== Matrix1 Menu $menu1 = GUICtrlCreateMenu("Menu") $newm1 = GUICtrlCreateMenuItem("New Matrix", $menu1) $openf1 = GUICtrlCreateMenuItem("Open Matrix", $menu1) $saveas1 = GUICtrlCreateMenuItem("Save As", $menu1) $RandMat1 = GUICtrlCreateMenuItem("Randomize Data in Matrix", $menu1) $separator1 = GUICtrlCreateMenuitem ("",$menu1,6) ; create a separator line $filexit1 = GUICtrlCreateMenuItem("Exit", $menu1) ;====> End of Matrix1 Menu dispmat("Matrix 1", $m1) GUISetState() EndFunc ; ========== Martix 2 GUI window ========== Func matrix2gui() $matrix2 = GuiCreate( "Matrix2", $w2, 200, @DesktopWidth - $w2 - 5, 40, Default) ;, $WS_EX_TOOLWINDOW ) GUISetBkColor( 0xF4F6B4 ) ;==== Matrix2 Menu $menu2 = GUICtrlCreateMenu("Menu") $newm2 = GUICtrlCreateMenuItem("New Matrix", $menu2) $openf2 = GUICtrlCreateMenuItem("Open Matrix", $menu2) $saveas2 = GUICtrlCreateMenuItem("Save As", $menu2) $RandMat2 = GUICtrlCreateMenuItem("Randomize Data in Matrix", $menu2) ;$loadcal2 = GUICtrlCreateMenuItem("Calculator", $menu2) $separator1 = GUICtrlCreateMenuitem ("",$menu2,6) ; create a separator line $filexit2 = GUICtrlCreateMenuItem("Exit", $menu2) ;====> End of Matrix2 Menu dispmat("Matrix 2", $m2) GUISetState() EndFunc ; ========== Martix 3 GUI window ========== Func matrix3gui() $matrix3 = GuiCreate( "Matrix3", 540, $h3, 40, @DesktopHeight - $h3 - 186, Default) ;, $WS_EX_TOOLWINDOW ) GUISetBkColor( 0xff0000 ) ;==== Matrix3 Menu $menu3 = GUICtrlCreateMenu("Menu") $newm3 = GUICtrlCreateMenuItem("New Matrix", $menu3) $openf3 = GUICtrlCreateMenuItem("Open Matrix", $menu3) $saveas3 = GUICtrlCreateMenuItem("Save As", $menu3) $RandMat3 = GUICtrlCreateMenuItem("Randomize Data in Matrix", $menu3) ;$loadcal3 = GUICtrlCreateMenuItem("Calculator", $menu3) $separator1 = GUICtrlCreateMenuitem ("",$menu3,6) ; create a separator line $filexit3 = GUICtrlCreateMenuItem("Exit", $menu3) ;====> End of Matrix3 Menu dispmat("Matrix 3", $m3) GUISetState() EndFunc ;================== dispmat ============================= ;Formats the input boxes in the resized Gui, and, displays the 2d array data (matrix). ; input -> $mainfrm = "Matrix 1" or "Matrix 2" or "Matrix 3"; $m = 2d array to be displayed. ; Func dispmat($mainfrm, $m = 0) If $m = 0 Then $m = NewMatrix($mainfrm) GUISetState (@SW_ENABLE,namerethndl($mainfrm)) dim $w2 = 0, $h3 = 0 ;====== for tooltips to work correctly individual inputbox handles are needed, and, ; previous inputbox handles need to be deleted. if $mainfrm = "Matrix 1" Then $xx = 0 while $Run1[$xx] <> "" ;MsgBox(0,"",$Run1[$xx]& " " & $xx) GUICtrlDelete($Run1[$xx]) $xx += 1 WEnd ElseIf $mainfrm = "Matrix 2" Then $xx = 0 while $Run2[$xx] <> "" GUICtrlDelete($Run2[$xx]) $xx += 1 WEnd ElseIf $mainfrm = "Matrix 3" Then $xx = 0 while $Run3[$xx] <> "" GUICtrlDelete($Run3[$xx]) $xx += 1 WEnd EndIf ; ===> End of previous inputbox handles deletion. ; Dim $Counter = 0, $WidthPos1 = -60, $HeightPos1 = 5, $r = UBound($m), $c = UBound($m, 2), $inputwidth = 60, $inputht = 20 ; --- set deciminal places ------ If $decplaceval <> 0 and $opos <> 10 and $opos <> 11 Then for $x = 0 to $r -1 for $y = 0 to $c -1 If IsNumber($m[$x][$y]) Then $m[$x][$y] = Round($m[$x][$y], $decplaceval) Next Next EndIf ;-------> end of set deciminal places------ ;MsgBox(0,"",$m[0][0] & " " & $m[0][1] & " row=" & $r) GUISetFont(9, 400, 0, "Tahoma") for $x = 0 to $r -1 for $y = 0 to $c -1 $WidthPos1 += 65 ;GUISetState (@SW_ENABLE,$mainfrm ) if $mainfrm = "Matrix 1" Then $Run1[$Counter] = GUICtrlCreateInput( $m[$x][$y], $WidthPos1, $HeightPos1, 60, 20) ; , $inputwidth, $inputht) ;MsgBox(0,"",$Run1[$Counter]& " " & $Counter & " data)] "& GUICtrlRead($Run1[$Counter] ));GUICtrlSetPos (-1, $WidthPos1, $HeightPos1, 60, 20) GUICtrlSetTip(-1,"Row "& $x +1 & " Column " & $y +1 & " [Data: " & GUICtrlRead($Run1[$Counter], 0) & "] Cell No. " & $counter+1 ) ElseIf $mainfrm = "Matrix 2" Then $Run2[$Counter] = GUICtrlCreateInput($m[$x][$y], $WidthPos1 , $HeightPos1, 60, 20) GUICtrlSetTip(-1,"Row "& $x +1 & " Column " & $y +1 & " [Data: " & GUICtrlRead($Run2[$Counter], 0) & "] Cell No. " & $counter+1 ) ElseIf $mainfrm = "Matrix 3" Then $Run3[$Counter] = GUICtrlCreateInput($m[$x][$y], $WidthPos1 , $HeightPos1, 60, 20) GUICtrlSetTip(-1,"Row "& $x +1 & " Column " & $y +1 & " [Data: " & GUICtrlRead($Run3[$Counter], 0) & "] Cell No. " & $counter+1 ) EndIf ;GUICtrlSetFont(-1, 9, 400, 0, "Tahoma") $Counter += 1 If Mod($Counter, $c) = 0 Then $WidthPos1 -= 65 * $c $HeightPos1 += 25 EndIf Next Next ;MsgBox(0,"",$WidthPos1 & "= $WidthPos1 "& $HeightPos1 & "= $HeightPos1 " & Mod($Counter, $c) & "= Mod($Counter, $c) "&$m[0][0] & " " & $m[0][1] & " row=" & $r) if $mainfrm = "Matrix 1" then WinMove($matrix1, "", @DesktopWidth * 0.03, @DesktopHeight * 0.02, 65*($c)+11, $HeightPos1 + 46) if $mainfrm = "Matrix 2" then $w2 = 65*($c)+11 WinMove($matrix2, "", @DesktopWidth - $w2 - 5, @DesktopHeight * 0.04, 65*($c)+11, $HeightPos1+ 46) EndIf if $mainfrm = "Matrix 3" then $h3 = $HeightPos1 +46 WinMove($matrix3, "", 20, @DesktopHeight - $h3 - 160, 65*($c)+11, $h3) EndIf EndFunc Func NewMatrix($mainfrm) GUISetState (@SW_ENABLE,namerethndl($mainfrm )) $Notident = 0 #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Auto-Fill Matrix", 396, 462, 193, 115) GUISetBkColor(0xECE9D8) $Input1 = GUICtrlCreateInput("1", 39, 157, 57, 28) GUICtrlSetTip($Input1, "e.g. enter 9 in Start No. and 7 in Last No."& @CRLF &"will genetate 9 8 7 9 8 7 9 ...until the matrix is filled. ") GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Input2 = GUICtrlCreateInput("2", 131, 157, 57, 28) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label1 = GUICtrlCreateLabel("Start No.", 32, 134, 96, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label2 = GUICtrlCreateLabel("Last No.", 128, 134, 96, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label3 = GUICtrlCreateLabel("Inclusive", 197, 156, 74, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label4 = GUICtrlCreateLabel("OR", 98, 192, 30, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Checkbox1 = GUICtrlCreateCheckbox("Identity Matrix", 48, 224, 145, 17) GUICtrlSetTip($Checkbox1, "Enabled only if a square matrix "& @CRLF &"i.e. No. of Rows equals No. of Columns") GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label5 = GUICtrlCreateLabel("Must be a square matrix", 48, 248, 168, 20) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") $but1gm = GUICtrlCreateButton("Generate Matrix", 248, 288, 124, 38, $BS_FLAT) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, 0xFF00FF) $Label6 = GUICtrlCreateLabel("OR", 101, 287, 30, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Checkbox2 = GUICtrlCreateCheckbox("Blank Matrix", 51, 319, 145, 17) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Checkbox3 = GUICtrlCreateCheckbox("Matrix All Zeros", 51, 396, 145, 17) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Label8 = GUICtrlCreateLabel("OR", 101, 364, 30, 24) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Group1 = GUICtrlCreateGroup("New Matrix Size", 32, 8, 281, 113) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") $Label9 = GUICtrlCreateLabel("No. of Columns", 175, 52, 108, 20) $Label7 = GUICtrlCreateLabel("No. of Rows", 62, 50, 87, 20) $Input3 = GUICtrlCreateInput(0, 78, 71, 49, 28) GUICtrlSetTip($Input3, " Maximium size of matrix is No. of Rows multiplied by No. of Columns = 626") GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") $Input4 = GUICtrlCreateInput(0, 202, 71, 49, 28) GUICtrlSetTip($Input4, "Press Enter, Tab, Or click on another input box to enter data") GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") GUICtrlCreateGroup("", -99, -99, 1, 1) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE $m = 1 ExitLoop Case $Input1 ;ControlClick ( "Auto-Fill Matrix", "", $Input2) Case $Input2 ;ControlClick ( "Auto-Fill Matrix", "", $Input1) Case $Checkbox1 if GUICtrlRead ( $Checkbox1) = $GUI_CHECKED then GUICtrlSetState ($Checkbox3, $GUI_DISABLE) GUICtrlSetState ($Checkbox2, $GUI_DISABLE) GUICtrlSetState ($Input1, $GUI_DISABLE) GUICtrlSetState ($Input2, $GUI_DISABLE) Else GUICtrlSetState ($Checkbox3, $GUI_ENABLE) GUICtrlSetState ($Checkbox2, $GUI_ENABLE) GUICtrlSetState ($Input1, $GUI_ENABLE) GUICtrlSetState ($Input2, $GUI_ENABLE) EndIf Case $but1gm if IsInt ($Input3) and IsInt ($Input4) and GUICtrlRead ($Input3) > 0 and GUICtrlRead ($Input4) > 0 Then $m = MatCreate(GUICtrlRead($Input3), GUICtrlRead ($Input4)) If GUICtrlGetState ($Input1) = 80 then if GUICtrlRead ($Input1) > 0 And GUICtrlRead ($Input2) > 0 Then $counter = GUICtrlRead ($Input1) $min = $counter $max = GUICtrlRead ($Input2) $increm = 1 if $min > $max then $increm = -1 EndIf EndIf for $x = 0 to GUICtrlRead ($Input3) -1 for $y = 0 to GUICtrlRead ($Input4) -1 If GUICtrlGetState ($Input1) = 80 then ;MsgBox(0,"",$counter & " $max" & $max) if GUICtrlRead ($Input1) >0 And GUICtrlRead ($Input2) > 0 Then $m[$x][$y] = $counter if $counter = $max Then $counter = $min Else $counter = $counter + $increm ;MsgBox(0,"",$counter & " " & $increm) EndIf EndIf EndIf If GUICtrlRead ($Checkbox3) = $GUI_CHECKED then $m[$x][$y] = 0 If GUICtrlRead ($Checkbox2) = $GUI_CHECKED then $m[$x][$y] = "" If GUICtrlRead ($Checkbox1) = $GUI_CHECKED then If $x = $y Then $m[$x][$y] = 1 Else $m[$x][$y] = 0 EndIf EndIf Next Next $filename = "Untitled" ExitLoop EndIf Case $Checkbox2 if GUICtrlRead ( $Checkbox2) = $GUI_CHECKED then GUICtrlSetState ($Checkbox3, $GUI_DISABLE) GUICtrlSetState ($Checkbox1, $GUI_DISABLE) GUICtrlSetState ($Input1, $GUI_DISABLE) GUICtrlSetState ($Input2, $GUI_DISABLE) Else GUICtrlSetState ($Checkbox3, $GUI_ENABLE) if $Notident = 0 then GUICtrlSetState ($Checkbox1, $GUI_ENABLE) GUICtrlSetState ($Input1, $GUI_ENABLE) GUICtrlSetState ($Input2, $GUI_ENABLE) EndIf Case $Checkbox3 if GUICtrlRead ( $Checkbox3) = $GUI_CHECKED then GUICtrlSetState ($Checkbox1, $GUI_DISABLE) GUICtrlSetState ($Checkbox2, $GUI_DISABLE) GUICtrlSetState ($Input1, $GUI_DISABLE) GUICtrlSetState ($Input2, $GUI_DISABLE) Else if $Notident = 0 then GUICtrlSetState ($Checkbox1, $GUI_ENABLE) GUICtrlSetState ($Checkbox2, $GUI_ENABLE) GUICtrlSetState ($Input1, $GUI_ENABLE) GUICtrlSetState ($Input2, $GUI_ENABLE) EndIf Case $Input3 ;ControlClick ( "Auto-Fill Matrix", "", $Input3) if GUICtrlRead ($Input3) = GUICtrlRead ($Input4) Then GUICtrlSetState ($Checkbox1, $GUI_ENABLE) $Notident = 0 else GUICtrlSetState ($Checkbox1, $GUI_DISABLE) $Notident = 1 EndIf if IsInt ($Input3) and IsInt ($Input4) and GUICtrlRead ($Input3) > 0 and GUICtrlRead ($Input4) > 0 Then GUICtrlSetData($Input1, 1) GUICtrlSetData($Input2, GUICtrlRead ($Input3) * GUICtrlRead ($Input4)) EndIf ;ControlClick ( "Auto-Fill Matrix", "", $Input4) Case $Input4 if GUICtrlRead ($Input3) = GUICtrlRead ($Input4) Then GUICtrlSetState ($Checkbox1, $GUI_ENABLE) $Notident = 0 else GUICtrlSetState ($Checkbox1, $GUI_DISABLE) $Notident = 1 EndIf if IsInt ($Input3) and IsInt ($Input4) and GUICtrlRead ($Input3) > 0 and GUICtrlRead ($Input4) > 0 Then GUICtrlSetData($Input1, 1) GUICtrlSetData($Input2, GUICtrlRead ($Input3) * GUICtrlRead ($Input4)) EndIf ;ControlClick ( "Auto-Fill Matrix", "", $Input3) EndSwitch WEnd DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $Form1, "int", 10, "long", 0x00090000);fade-out return $m ;GUIDelete($Form1); ; will return 1 EndFunc Func expandabbrev($mainfrm) Local $n If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M1" Then $n = "Matrix 1" If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M2" Then $n = "Matrix 2" If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M3" Then $n = "Matrix 3" return $n EndFunc ; Name variable return Handle Func namerethndl($mainfrm) Local $n If $mainfrm = "Matrix 1" Then $n = $matrix1 If $mainfrm = "Matrix 2" Then $n = $matrix2 If $mainfrm = "Matrix 3" Then $n = $matrix3 return $n EndFunc Func mxretmat($mainfrm) Local $n If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M1" Then $n = $m1 If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M2" Then $n = $m2 If StringLeft($mainfrm,1) & StringRight($mainfrm,1) = "M3" Then $n = $m3 If $mainfrm = $tempm Then Return $tempm Else return $n EndIf EndFunc ; Save matrix to disk. csv file extension Func savemat($mainfrm, $m) GUISetState (@SW_ENABLE,$mainfrm ) $Pathfile = FileSaveDialog( "Choose a name.",@WorkingDir,"Comma-Separated Variables files (*.csv)|All (*.*)",8) If @error Then ;MsgBox(4096,"","No File(s) chosen") $p = 1 return $p ;MsgBox(0,"return -1", $p) EndIf dim $r = UBound($m), $c = UBound($m, 2) if StringRight($Pathfile,4) <> ".csv" then $Pathfile = $Pathfile & ".csv" $filename = StringTrimLeft($Pathfile,StringLen(@WorkingDir)+1) $hfile = FileOpen($Pathfile, 2) $Line = "" $Counter = 0 for $x = 0 to $r -1 for $y = 0 to $c -1 if $mainfrm = "Matrix 1" Then $COMMALESS = StringReplace (GUICtrlRead($run1[$Counter]),",","{COMMA}") $Line = $Line & $COMMALESS & "," EndIf if $mainfrm = "Matrix 2" Then $COMMALESS = StringReplace (GUICtrlRead($run2[$Counter]),",","{COMMA}") $Line = $Line & $COMMALESS & "," EndIf if $mainfrm = "Matrix 3" Then $COMMALESS = StringReplace (GUICtrlRead($run3[$Counter]),",","{COMMA}") $Line = $Line & $COMMALESS & "," EndIf $Counter += 1 Next FileWriteLine($hfile, StringTrimRight($Line,1) & @CRLF) $Line = "" next FileClose($hfile) $p = 0 ;MsgBox(0,"End", $p) Return $p EndFunc ; Open file stored on disk. csv file extension ; $Pathfile - path and name of file to be opened ; If $Pathfile not supplied, FileOpenDialog will allow the choosing a file to be open. Func fileop($Pathfile = "") If $Pathfile = "" Then $Pathfile = FileOpenDialog( "Choose a name.",@WorkingDir,"Comma-Separated Variables files (*.csv)|All (*.*)",8) EndIf If @error Then ;MsgBox(4096,"","No File(s) chosen") $m = 1 return $m EndIf $filename = StringTrimLeft($Pathfile,StringLen(@WorkingDir)+1) $hfile = FileOpen($Pathfile, 0) $colcount = 1 $line = FileReadLine($hfile) for $ch = 1 to StringLen($line) if StringMid($line, $ch,1) = "," then $colcount += 1 ;MsgBox(0,"","rowcount "& $rowcount & " colcount " & $colcount) next $rowcount = 1 While 1 $line = FileReadLine($hfile) If @error = -1 Then ExitLoop $rowcount += 1 Wend ;MsgBox(0,"","rowcount "& $rowcount & " colcount " & $colcount) FileClose($hfile) $m = MatCreate($rowcount, $colcount) ;MsgBox(0,"","$rowcount=" & $rowcount & " $colcount=" & $colcount) $hfile = FileOpen($Pathfile, 0) for $x = 0 to $rowcount - 1 $line = StringSplit (FileReadLine($hfile),",") for $y = 0 to $colcount - 1 $m[$x][$y] = StringReplace ($line[$y+1],"{COMMA}",",") ;MsgBox(0,"","$x=" & $x & " $y=" & $y & " $m[$x][$y]=" & $m[$x][$y] ) Next next FileClose($hfile) return $m EndFunc ;Randomize existing data in in array (matrix) Func RandomizeMatrixData($m) ; Shuffle Dim $irow= UBound($m), $icol = UBound($m, 2) for $loop5 = 1 to 5 For $x = 0 To $irow - 1 for $y = 0 to $icol -1 $c = $m[$x][$y] ; swap $rx = Random (0,($irow -1),1) ; Random x index $ry = Random (0,($icol -1),1) ; Random y index $m[$x][$y] = $m[$rx][$ry] ; swap $m[$rx][$ry] = $c ; final swap Next Next next return $m EndFunc ;==== What is seen on screen are the numbers used in the maths operations. Refresh Array (refresh matrix) Func refreshmat($m, $mainfrm) GUISetState (@SW_ENABLE,$mainfrm ) dim $r = UBound($m), $c = UBound($m, 2) consolewrite( 'refresh $r ' & $r & ' $C =' & $c & ' $mainfrm =' & $mainfrm &@CRLF) Dim $n[$r][$c] $Counter = 0 for $x = 0 to $r -1 for $y = 0 to $c -1 if $mainfrm = "Matrix 1" Then $n[$x][$y] = GUICtrlRead($run1[$Counter]) if $n[$x][$y] <> $m[$x][$y] then $Matname1 = "Untitled" EndIf if $mainfrm = "Matrix 2" Then $n[$x][$y] = GUICtrlRead($run2[$Counter]) if $n[$x][$y] <> $m[$x][$y] then $Matname2 = "Untitled" EndIf if $mainfrm = "Matrix 3" Then $n[$x][$y] = GUICtrlRead($run3[$Counter]) if $n[$x][$y] <> $m[$x][$y] then $Matname3 = "Untitled" EndIf $Counter += 1 Next next Return $n EndFunc ;==================================================== ; Returns the Handle of GUI the mouse is over. ;http://www.autoitscript.com/forum/index.php?s=&showtopic=19370&view=findpost&p=444962 ; Func GetHoveredHwnd() Local $iRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1)) If IsArray($iRet) Then ;MsgBox(0,"",$iRet[0] & " " & $iRet[1] & " " & $iRet[2] & " " & HWnd($iRet[0] )) Return HWnd($iRet[0]) else Return SetError(1, 0, 0) EndIf EndFunc ;chkisnum(input variable ) check if number allows "-" and "." and not an array Output 0 if not a number or 1 is number func chkisnum($a) dim $fL = 1 if not(IsArray($a)) then for $cpos = 1 to StringLen($a) If StringIsDigit(StringMid ( $a, $cpos ,1 )) Or StringMid ( $a, $cpos ,1 ) = "." or StringMid ( $a, $cpos ,1 ) = "-" Then ;consolewrite('$cpos =' & $cpos & ' chkisnum= ' & StringMid ( $a, $cpos ,1 ) & @CRLF) ;$fL = 1 Else ;consolewrite('$cpos =' & $cpos & ' chkisnum= ' & StringMid ( $a, $cpos ,1 ) & @CRLF) $fL = 0 EndIf next Else $fL = 0 EndIf Return $fL EndFunc ;====================================================== ; Will allow left mouse button drag on the gui. Also, when the gui height is greater than the screen ; left clicking on the gui raises the gui to view bottom cells. ; Drag Window 3 of 3 addin Func _WinMove($HWnd, $Command, $wParam, $lParam) If BitAND(WinGetState($HWnd), 32) Then Return $GUI_RUNDEFMSG ;DllCall("user32.dll", "long", "SendMessage", "hwnd", $HWnd, "int", @DesktopWidth_SYSCOMMAND, "int", 0xF009, "int", 0) dllcall("user32.dll","int","SendMessage","hWnd", $HWnd, "int",$WM_LBUTTONDOWN,"int", $HTCAPTION,"int", 0) $pos = WinGetPos($HWnd) if @DesktopHeight - $pos[3] < 0 Then WinMove ( $HWnd, "", $pos[0], $pos[1] + (-50 * (((@DesktopHeight - $pos[1] - $pos[3]-50) <= 0) And ($pos[1] <= 0)))) EndFunc Func enterkey() $nMsg = $linButok ;MsgBox(0,"","enter") EndFunc ;=============== Basic Command line =================================== ;rest of script is the calculator function ;return the calculation result of $stringin ;very little error checking, just a sample to show a way to make a calculator Func calculate($stringin) $stringin = StringReplace($stringin,'^','**') ;$stringin = StringReplace($stringin,'#','+') $stringtocalc = $stringin & '=' $splitcalc = StringSplit($stringtocalc,"") $pp = 1 Return compute(0) EndFunc Func Commandline() $linecalcgui = GUICreate("Line Calculator", 523, 200, 347, 263, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS)) GUISetIcon("D:\003.ico") $linButok = GUICtrlCreateButton("&OK", 79, 171, 75, 25, 0) $linButcan = GUICtrlCreateButton("&Cancel", 306, 169, 75, 25, 0) $lineEdit = GUICtrlCreateEdit("", -2, -2, 525, 141, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY,$ES_WANTRETURN,$WS_VSCROLL,$WS_BORDER)) GUICtrlSetData(-1, ' Enter the line calculation below, ( Copy/Paste examples further down)' & @CRLF & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' Allowed operators and functions :-, ' & @CRLF & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' Common operators :-, ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' * , / , + , - , ^ , ( , ) . mod(num, modulus)' & @CRLF & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' Trigonometry operators :-' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' sin(degrees), cos(degrees), tan(degrees), ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit , ' asin(degrees), acos(degrees), atan(degrees), pi ' & @CRLF & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' Matrices operators :-' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' All common operators work on the Matrices m1, m2, m3,' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' trn(matrix) Transpose a matrix - rows and columns swap, ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' ^e all elements of a matrix to the power of ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' det(matrix) Determinant, ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' utr(matrix) Upper Triangle, ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' minv(matrix or number, m) multiplicative inverse of a, Modulus m. ' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' Other :- ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' gcd( $a, $b) Greatest Common Denominator,' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' Prim($a) Return Factors or is Prime' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' Examples (Can be copy/paste to command line) :- ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' ((45- 3^2.6)/17)*cos(23.7)*Mod(12^4,5) ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1*m1=m2 To display a matrix result enter =m1 ,=m2, or, =m3 ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' 1/m1=m2 or m1^-1=m3 Inverse of matrix ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1/m1=m2 or m1*m1^-1=m3 Identity matrix is the result ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' The inverse of a matrix = (1/determinant) * adjoint ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' So, the adjoint = the inverse * determinant ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1^-1*det(m1)=m3 is the Adjoint ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' (2+m1)/4=m2 and 2+m1/4=m3 give different results. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1-trn(m1)=m3 A matrix minus the transpose of the matrix. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' utr(m1)=m2 Upper Triangle ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' trn(utr(m1))=m3 Upper Triangle transposed ' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1^e2.5=m2 Each element in m1 to the 2.5 power. Note :- If an ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' element cotains a negative number and the power has a deciminal ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' part, the answer is a complex number for that element. ' & @CRLF ) _GUICtrlEdit_AppendText ($lineEdit ,' m1^4=m2 Same as m1*m1*m1*m1 Power must be an integer only. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' mod(m2,97)=m2 Matrix m2 mod 97 ' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' Encrypt m2 Which contains whole, positive numbers, say ASCII values. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' m1 contains whole, positive random numbers, but must be square, the key. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' The modulus should be a prime number. 97 is used in this formula. ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' mod(m1*m2,97)=m3 Encrypted m2 is displayed in m3 ' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' To decrypt the code in m3 matrix use ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' mod((minv(m1,97)*m3),97)=m3 Now, m3 contains decryption to compare to m2 ' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' mod((m1*minv(m1,97)),97)=m2 Shows that the mod of a matrix multiplied ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' by its multiplicative inverse (with same modulus) = an identity matrix' & @CRLF & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' (sin(40))^2 + (cos(40))^2 This result should = 1 ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' cos(60)/sin(30) This result should = 1' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' asin(sin(30)) acos(cos(40)) atan(tan(50)) pi ' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' (3^2+4^2)^0.5 Hypotenuse, other 2 sides are 3 and 4.' & @CRLF) _GUICtrlEdit_AppendText ($lineEdit ,' ' & @CRLF) GUICtrlSetColor(-1, 0x000080) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, 0xA6CAF0) $commandInput = GUICtrlCreateInput("M2 * 2 + 1 = M3", 8, 142, 507, 24, 0) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUISetState(@SW_SHOW) ;MsgBox(0,antilog(Log($String)),Exp(Log($string))) GUISetState(@SW_SHOW) EndFunc func compute($rank); Local $mtt,$tem1,$tem2,$tem3,$pnum2,$bracketset consolewrite('@start compute rank= ' & $rank & ' $tem1 =' & $tem1 & ' $tem2 =' & $tem2 & ' $mtt =' & $mtt & ' $pp =' & $pp & " of " & $splitcalc[0] & @CRLF) $tem1=0; ;$tem2=0; $bracketset=0 while(True) $pp += 1; Switch $splitcalc[$pp-1] Case ' ' ;ignore Case 'G' ;gcd? ConsoleWrite('got the g for gcd' &@CRLF) If StringMid($stringtocalc,$pp - 1,3) = "GCD" then $pp += 2 $temg = compute( 3) $pp += 1 $tem1 = compute( 3) If not(IsArray($tem1)) And not(IsArray($temg)) Then $tem1 = gcd($temg, $tem1); $temg = "" EndIf $pp += 1 Case 'M' ;Mod If StringMid($stringtocalc,$pp - 1,3) = "MOD" then $pp += 2 $temg = compute( 3) $pp += 1 $tem1 = compute( 3) consolewrite( ' mod StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($temg,1)) =' & StringLeft ($temg,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($temg) =' & chkisnum($temg) & @CRLF) If chkisnum($tem1) And chkisnum($temg) Then $tem1 = Mod($temg, $tem1) ElseIf IsArray($tem1) Then consolewrite( '3* $temg ' & $temg & '$tem1 =' & $tem1 & @CRLF) $tem1 = " Modulus can not be an array" $mf = 0 elseIf IsArray($temg) and chkisnum($tem1) Then consolewrite( ' 7* $temg ' & $temg & '$tem1 =' & $tem1 & @CRLF) $decplaceval = 8 $tem1 = _arraymod($temg, $tem1) $decplaceval = 0 $mf = 2 EndIf $pp += 1 ElseIf StringMid($stringtocalc,$pp - 1,4) = "MINV" then $pp += 3 $temg = compute( 3) $pp += 1 $tem1 = compute( 3) consolewrite( ' minv StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($temg,1)) =' & StringLeft ($temg,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($temg) =' & chkisnum($temg) & @CRLF) If chkisnum($tem1) And chkisnum($temg) Then $tem1 = Multinv($temg, $tem1) elseIf IsArray($temg) and chkisnum($tem1) Then consolewrite( ' minv2 $temg ' & $temg & '$tem1 =' & $tem1 & @CRLF) $tem1 = matrixInv($temg, $tem1) $mf = 2 EndIf $pp += 1 $temg = "" ElseIf StringMid($stringtocalc,$pp - 1,2) = "M1" then ConsoleWrite('got the M1' &@CRLF) $pp += 1 $tem1 = $m1 ElseIf StringMid($stringtocalc,$pp - 1,2) = "M2" then ConsoleWrite('got the M2' &@CRLF) $pp += 1 $tem1 = $m2 ElseIf StringMid($stringtocalc,$pp - 1,2) = "M3" then ConsoleWrite('got the M3' &@CRLF) $pp += 1 $tem1 = $m3 EndIf If $pp < $splitcalc[0] Then while( $splitcalc[$pp] = '.') or StringIsDigit($splitcalc[$pp]) $pp += 1; WEnd EndIf Case 'P' ;Prim If StringMid($stringtocalc,$pp - 1,4) = "PRIM" then ConsoleWrite('got the p for Prim' &@CRLF) $pp += 3 $tem2 = compute( 3); If not(IsArray($tem1)) Or not(IsArray($temg)) Then $tem1 = Prim($tem2 ); If $tem2 = number( $tem1) Then $tem1 = "The number " &$tem1 & " is a prime number" Else $tem1 = "The factors of " & $tem2 & " are " & $tem1 EndIf EndIf ElseIf ($splitcalc[$pp] = 'I') then $tem1 = $PI; $pp += 1; EndIf Case 'S' ;sin? ConsoleWrite('got the s for sin' &@CRLF) If StringMid($stringtocalc,$pp - 1,3) = "SIN" then $pp += 2 If not(IsArray($tem1)) Then $tem1 = sin($pifactor * compute( 3)); EndIf Case 'D'; Determinant? If StringMid($stringtocalc,$pp - 1,3) = "DET" then ; Determinant $pp += 2 $tem3 = compute(3) consolewrite(' Determinant rank= ' & $rank & '$tem1 =' & $tem1 & ' $tem3 =' & $tem3 & ' $pp ' & $pp & " char = " & $splitcalc[$pp] & @CRLF) If IsArray($tem3) Then $tem1 = Round(_DetMatrix($tem3 ),10) $mf = 0 EndIf EndIf Case 'U'; Upper Triangle? If StringMid($stringtocalc,$pp - 1,3) = "UTR" then ; Upper Triangle $pp += 2 $tem3 = compute(3) consolewrite(' Upper Triangle = ' & $rank & '$tem1 =' & $tem1 & ' $tem3 =' & $tem3 & ' $pp ' & $pp & " char = " & $splitcalc[$pp] & @CRLF) If IsArray($tem3) Then $tem1 = upperTriangle($tem3 ) $tem1 = upperTriangle($tem1 ) $mf = 1 EndIf EndIf Case 'T'; Transpose, tan? If StringMid($stringtocalc,$pp - 1,3) = "TRN" then ; Transpose $pp += 2 $tem3 = compute(3) consolewrite(' Transpose rank= ' & $rank & '$tem1 =' & $tem1 & ' $tem3 =' & $tem3 & ' $pp ' & $pp & " char = " & $splitcalc[$pp] & @CRLF) If IsArray($tem3) Then $tem1 = matrixTranspose($tem3 ) If $mf = 0 Then $mf = 1 EndIf ElseIf StringMid($stringtocalc,$pp - 1,3) = "TAN" then $pp += 2 If not(IsArray($tem1)) Then $tem1 = Tan($pifactor * compute( 3)); EndIf If $pp < $splitcalc[0] Then while( $splitcalc[$pp] = '.') or StringIsDigit($splitcalc[$pp]) $pp += 1; WEnd EndIf Case 'A' If StringMid($stringtocalc,$pp - 1,4) = "ATAN" then $pp += 3; If not(IsArray($tem1)) Then $tem1 = atan(compute( 3))/$pifactor; elseif StringMid($stringtocalc,$pp - 1,4) = 'ASIN' then $pp += 3; ConsoleWrite('at arcsin pp = ' & $splitcalc[$pp] & @CRLF) If not(IsArray($tem1)) Then $tem1 = ASin(compute( 3))/$pifactor; elseif (StringMid($stringtocalc,$pp - 1,4) = 'ACOS') then $pp += 3 If not(IsArray($tem1)) Then $tem1 = ACos(compute( 2))/$pifactor; EndIf If $pp < $splitcalc[0] Then while( $splitcalc[$pp] = '.') or StringIsDigit($splitcalc[$pp+1]) $pp += 1; {get past the Add bit} WEnd EndIf Case 'C';cos? if StringMid($stringtocalc,$pp - 1,3) = 'COS' then $pp += 2 If not(IsArray($tem1)) Then $tem1 = cos($pifactor * compute( 2)); EndIf Case '(' consolewrite(' ( rank= ' & $rank & '$tem =' & $tem1 & ' $tem2 =' & $tem2 & ' $pp ' & $pp & @CRLF) $bracketset = 1; $tem1 = compute( 0); Case ')' consolewrite(' )1 rank= ' & $rank & '$tem1 =' & $tem1 & ' $tem2 =' & $tem2 & ' $pp ' & $pp & " char = " & $splitcalc[$pp] & @CRLF) if ($bracketset = 1) then $bracketset = 0 else consolewrite(' )2 rank= ' & $rank & '$tem1 =' & $tem1 & ' $tem2 =' & $tem2 & ' $pp ' & $pp & " char = " & $splitcalc[$pp] & @CRLF) $pp -= 1 $result = $tem1; Return $result EndIf Case '/' if ($rank >= 2) then $pp -= 1; $result = $tem1; Return $result else $tem2 = compute( 2); if $tem2 = "0" then MsgBox(0,'Error','divide by 0!'); $divzero = True; $result = 0; Return $result; else consolewrite( ' / StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($tem2,1)) =' & StringLeft ($tem2,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($tem2) =' & chkisnum($tem2) & @CRLF) If chkisnum($tem1) And chkisnum($tem2) Then $tem1 = $tem1 / $tem2; ElseIf IsArray($tem1) And IsArray($tem2) Then consolewrite( '3* $tem2 ' & $tem2 & '$tem1 =' & $tem1 & @CRLF) $tem1 = ArrayProduct($tem1,matrixInv($tem2)) If $mf = 0 Then $mf = 1 elseIf IsArray($tem1) and chkisnum($tem2) Then consolewrite( '5* $tem2 ' & $tem2 & '$tem1 =' & $tem1 & @CRLF) $tem1 = _arrayScalarProduct($tem1, 1/$tem2) $mf = 1 elseIf IsArray($tem2) and chkisnum ($tem1) Then consolewrite( ' 7* $tem2 ' & $tem2 & '$tem1 =' & $tem1 & @CRLF) $tem1 = _arrayScalarProduct(matrixInv($tem2), $tem1) If $mf = 0 Then $mf = 1 EndIf ;$pp += 1 EndIf EndIf Case '*' consolewrite( ' * start $pp ' & $pp & '$tem1 =' & $tem1 & @CRLF) If StringMid($stringtocalc,$pp - 1,3) = "**E" then ;^E each element in matrix to power $pp += 2;point to exp If $splitcalc[$pp] = '-' Then $pp += 1 $tem2 = -compute(4) ElseIf $splitcalc[$pp] = '+' Then $pp += 1 $tem2 = compute(4) Else $tem2 = compute(4); EndIf ;If StringIsDigit ($tem1) And StringIsDigit ($tem2) Then ConsoleWrite(' powerE $tem1 =' & $tem1 & ' $tem2 =' & $tem2 &' $pp= ' & $splitcalc[$pp] & @CRLF) If chkisnum($tem1) Then $tem1 = "the ^e operand only works on a matrix" $mf = 0 ;$tem1 = Power($tem1,$tem2) ElseIf IsArray($tem2) Then $tem1 = "To the power of a matrix is not allowed." $mf = 0 elseIf IsArray($tem1) and chkisnum($tem2) Then consolewrite( 'm s powerE $tem2 ' & $tem2 & '$tem1 =' & $tem1 & @CRLF) $tem1 = matrixelementpower($tem1, $tem2) If $mf = 0 Then $mf = 1 EndIf ElseIf $splitcalc[$pp] = '*' then ; ^ the matrix as a whole to the power of (an integer) ;exponent required $pp += 1;point to exp ConsoleWrite('actual for power = ' & $splitcalc[$pp] & @CRLF) If $splitcalc[$pp] = '-' Then $pp += 1 $tem2 = -compute(4) ElseIf $splitcalc[$pp] = '+' Then $pp += 1 $tem2 = compute(4) Else $tem2 = compute(4); EndIf ;If StringIsDigit ($tem1) And StringIsDigit ($tem2) Then ConsoleWrite(' power $tem1 =' & $tem1 & ' $tem2 =' & $tem2 &' $pp= ' & $splitcalc[$pp] & @CRLF) If chkisnum($tem1) And chkisnum($tem2) Then $tem1 = Power($tem1,$tem2) ElseIf IsArray($tem2) Then $tem1 = "To the power of a matrix is not allowed." $mf = 0 elseIf IsArray($tem1) and chkisnum($tem2) Then consolewrite( 'm s power $tem2 ' & $tem2 & '$tem1 =' & $tem1 & @CRLF) If $tem2 -int($tem2) = 0 Then $tem1 = matrixpower($tem1, $tem2) $mf = 1 Else $tem1 = "For a matrix the power must be an integer only." $mf = 0 EndIf EndIf else if ($rank >= 3) then $pp -= 1; $result = $tem1; Return $result; else $mtt = compute( 3); consolewrite( '* StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($mtt,1)) =' & StringLeft ($mtt,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($mtt) =' & chkisnum($mtt) & @CRLF) If chkisnum($tem1) And chkisnum($mtt) Then $tem1 = $tem1 * $mtt; ElseIf IsArray($tem1) And IsArray($mtt) Then consolewrite( '3* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = ArrayProduct($tem1,$mtt) $mf = 1 elseIf IsArray($tem1) and chkisnum($mtt) Then consolewrite( '5* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = _arrayScalarProduct($tem1, $mtt) $mf = 1 elseIf IsArray($mtt) and chkisnum($tem1) Then consolewrite( ' 7* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = _arrayScalarProduct($mtt, $tem1) $mf = 1 EndIf EndIf EndIf Case '+' if ($rank >= 1) then $pp -= 1; $result = $tem1; Return $result else $mtt = compute(1); consolewrite( ' + StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($mtt,1)) =' & StringLeft ($mtt,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($mtt) =' & chkisnum($mtt) & @CRLF) If chkisnum($tem1) And chkisnum($mtt) Then $tem1 = $tem1 + $mtt; ElseIf IsArray($tem1) And IsArray($mtt) Then consolewrite( '3* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = matrixplusmatrix($tem1, $mtt) $mf = 1 elseIf IsArray($tem1) and chkisnum($mtt) Then consolewrite( '5* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = arrayplusScalar($tem1, $mtt) $mf = 1 elseIf IsArray($mtt) and chkisnum($tem1) Then consolewrite( ' 7* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = arrayplusScalar($mtt, $tem1) $mf = 1 EndIf EndIf; Case '-'; consolewrite(' - rank= ' & $rank & '$tem =' & $tem1 & ' $tem2 =' & $tem2 & ' $pp ' & $pp & @CRLF) if ($rank >= 1) then $pp -= 1 $result = $tem1; Return $result else $mtt = compute(1); consolewrite( ' - StringLeft ($tem1,1) =' & StringLeft ($tem1,1) & ' StringLeft ($mtt,1)) =' & StringLeft ($mtt,1) &' chkisnum($tem1) ' & chkisnum($tem1) & ' chkisnum($mtt) =' & chkisnum($mtt) & @CRLF) If chkisnum($tem1) And chkisnum($mtt) Then $tem1 = $tem1 - $mtt; ElseIf IsArray($tem1) And IsArray($mtt) Then consolewrite( '3* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = matrixminusmatrix($tem1,$mtt) $mf = 1 elseIf IsArray($tem1) and chkisnum($mtt) Then consolewrite( '5* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = arrayplusScalar($tem1, -$mtt) $mf = 1 elseIf IsArray($mtt) and chkisnum($tem1) Then consolewrite( ' 7* $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) $tem1 = arrayplusScalar($mtt, -$tem1) $mf = 1 EndIf EndIf; Case '=' ;{CR LF NULL} $pp -= 1;{set back to end of line or compute will go crashing through the comments} $result = $tem1; consolewrite( 'case = $mtt ' & $mtt & '$tem1 =' & $tem1 & @CRLF) if ($bracketset = 1)then MsgBox(0,'ERROR','Unmatched brackets') EndIf; Return $result Case '0' To '9'; $pp -= 1; $pnum2 = $pp; while( $splitcalc[$pp] = '.') or StringIsDigit($splitcalc[$pp]) $pp += 1; WEnd $tem1 = StringMid($stringtocalc,$pnum2,$pp-$pnum2) Case '.' ; $pp -= 1; $pnum2 = $pp; while( $splitcalc[$pp] = '.') or StringIsDigit($splitcalc[$pp]) $pp += 1; WEnd $tem1 = StringMid($stringtocalc,$pnum2,$pp-$pnum2) Case ',';this bit doesn't work yet $pp -= 1; $result = $tem1; Return $result EndSwitch; wend; EndFunc ; Select Matrix to Display Result Func SelMatRslt() dim $ret $Form2 = GUICreate("Select a result matrix", 400, 119, 341, 254) GUISetIcon("D:\002.ico") $Button1 = GUICtrlCreateButton("Matrix 1", 36, 76, 75, 25, 0) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, 0xA6CAF0) $Button2 = GUICtrlCreateButton("Matrix 2", 115, 76, 75, 25, 0) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, 0xFFFFE1) $Button3 = GUICtrlCreateButton("Matrix 3", 195, 76, 75, 25, 0) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUICtrlSetBkColor(-1, 0xFF0000) $Button4 = GUICtrlCreateButton("Cancel", 300, 76, 75, 25, 0) $Label1 = GUICtrlCreateLabel("Result is a matrix, and, a result matrix is not selected.", 14, 8, 369, 20) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") $Label2 = GUICtrlCreateLabel("Please select a matrix to display the results.", 16, 39, 308, 20) GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif") GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE, $Button4 $ret = "0" ExitLoop Case $Button1 $ret = "M1" ExitLoop Case $Button2 $ret = "M2" ExitLoop Case $Button3 $ret = "M3" ExitLoop EndSwitch WEnd GUISetState(@SW_HIDE) return $ret EndFunc #cs Func Max($a,$b) ConsoleWrite('a,b = ' & $a & ', ' & $b & @CRLF) If $a > $b Then Return $a Return $b EndFunc Func Min($a,$b) ConsoleWrite('a,b = ' & $a & ', ' & $b & @CRLF) If $a < $b Then Return $a Return $b EndFunc #ce ;===============> End of Basic Command line calcs =================================== ;=============== Start of matrixUDF.au3 file =================================== ;matrixUDF.au3 file ;Global $iDF = 0 ; use to calculate determinantand used in Upper Triangle calculations. sign of submatrices ;Global $setdecplac, $decplInput1, $decplaceval = 0 ;========================================================================== ; Function: ArrayProduct (modified mod added) ; Purpose: Calculate the ordinary matrix product of two matricies, as described at: ; en.wikipedia.org/wiki/Matrix_multiplication#Ordinary_matrix_product ; Call with: _ArrayProduct( $avA, $avB ) ; Where: $avA and $avB are 2D arrays of numbers where the ; row count (depth) of $avA matches the column count of $avB ; On success: Returns a 2D array (product matrix) ; On failure: Returns 0 and sets @error and @extended for invalid inputs ;========================================================================== Func ArrayProduct($avA, $avB, $m = 0) ; Check for parameter errors. If IsArray($avA) = 0 Or IsArray($avB) = 0 Then Return SetError(1, 1, 0) ; both must be arrays If UBound($avA, 0) <> 2 Or UBound($avB, 0) <> 2 Then Return SetError(1, 2, 0) ; both must be 2D arrays If UBound($avA, 2) <> UBound($avB) Then Return SetError(1, 3, 0) ; depth must match ; Create return array Local $iRows = UBound($avA), $iCols = UBound($avB, 2), $iDepth = UBound($avA, 2) Local $avRET[$iRows][$iCols] ; Calculate values For $r = 0 To $iRows - 1 For $c = 0 To $iCols - 1 $x = 0 For $z = 0 To $iDepth - 1 $x += ($avA[$r][$z] * $avB[$z][$c]) if $x < 10^-11 and $x > -10^-11 then $x = Int ($x); Rounded at 11 decimal places Next ;============== Mod if $m = 0 Then $avRET[$r][$c] = $x Else if IsNumber($m) then ; If $decplaceval <> 0 Then $x = round($x,$decplaceval) $avRET[$r][$c] = mod($x, $m) EndIf EndIf ;===============> End of Mod Section Next Next Return $avRET EndFunc ;==>_ArrayProduct ;Matrix $a multiplied by a Scalar (number) $k func _arrayScalarProduct($a, $k) ; Check for parameter errors. If IsArray($a) = 0 Then Return SetError(1, 1, 0) ; must be array Local $iRows = UBound($a), $iCols = UBound($a, 2) Local $aRET[$iRows][$iCols] For $r = 0 To $iRows - 1 For $c = 0 To $iCols - 1 $aRET[$r][$c] = $a[$r][$c] * $k Next Next Return $aRET EndFunc ;Matrix $a plus a Scalar (number) $k func arrayplusScalar($a, $k) If IsArray($a) = 0 Then Return SetError(1, 1, 0) ; must be array Local $iRows = UBound($a), $iCols = UBound($a, 2) Local $aRET[$iRows][$iCols] For $r = 0 To $iRows - 1 For $c = 0 To $iCols - 1 $aRET[$r][$c] = $a[$r][$c] + $k Next Next Return $aRET EndFunc ; Transpose a matrix columns become rows and rows become columns. Func matrixTranspose($a) Local $tms = UBound($a), $cols = UBound($a, 2) $m = MatCreate($cols, $tms) for $i = 0 to $tms -1 for $j = 0 to $cols -1 $m[$j][$i] = $a[$i][$j] Next Next Return $m EndFunc ; create matrix $a rows and $b columns Func MatCreate($a, $b) Dim $m[$a][$b] for $i =0 to $a-1 for $j = 0 to $b -1 $m[$i][$j] = 0 Next Next return $m EndFunc Func upperTriangle($a) If UBound($a, 2) <> UBound($a) Then Return SetError(1, 3, 0) ; depth must match Dim $tms = UBound($a), $f1 = 0, $temp = 0, $v = 1, $mc = $a, $stopLoop = 0 ;MsgBox(0,"",UBound($a) & " " & UBound($a, 2) ) $iDF = 1 ;MsgBox(0,"iNFO"," Matrix must be square uPPER TRI. L223 ROW = "& UBound($a) & " COLUMN = "&UBound($a, 2) ) For $col = 0 To $tms -1 For $row = $col +1 To $tms -1 $v= 1 $stopLoop = 0 While $mc[$col][$col] = 0 and $stopLoop = 0 if $col + $v >= $tms then $iDF = 0 $stopLoop = 1 Else For $c = 0 to $tms If $col < $tms and $c < $tms Then $temp = $mc[$col][$c] $mc[$col][$c] = $mc[$col + $v][$c] $mc[$col +$v][$c] = $temp EndIf Next EndIf $v = $v + 1 $iDF = $iDF * (-1) WEnd if $mc[$col][$col] <> 0 then $f1 = (-1)* $mc[$row][$col] / $mc[$col][$col] for $i = $col to $tms - 1 $mc[$row][$i] = $f1 * $mc[$col][$i] + $mc[$row][$i] ;MsgBox(0,"Prim", $col & " " & $mc[$row][$i]) Next EndIf $v = 1 Next Next Return $mc EndFunc ; matrix $matr1 minus matrix $matr2 Func matrixminusmatrix($matr1, $matr2) If UBound($matr1, 2) <> UBound($matr2) and UBound($matr2, 2) <> UBound($matr1) Then SetError(0) Return -1 EndIf Local $r = UBound($matr1), $cols = UBound($matr1, 2) $m = MatCreate($r, $cols) for $i = 0 to $r -1 for $j = 0 to $cols -1 $m[$i][$j] = $matr1[$i][$j] - $matr2[$i][$j] Next Next Return $m EndFunc ; matrix $matr1 plus matrix $matr2 Func matrixplusmatrix($matr1, $matr2) If UBound($matr1, 2) <> UBound($matr2) and UBound($matr2, 2) <> UBound($matr1) Then SetError(0) Return -1 EndIf Local $r = UBound($matr1), $cols = UBound($matr1, 2) $m = MatCreate($r, $cols) for $i = 0 to $r -1 for $j = 0 to $cols -1 $m[$i][$j] = $matr1[$i][$j] + $matr2[$i][$j] Next Next Return $m EndFunc ;Determines the reciprocal or multiplicative inverse of, a Modulo m ; provide a and m have no common factors. ;$a and $m are numbers Func Multinv($a, $m) dim $minu = 0 if $a < 0 then $a = $a *-1 $minu = 1 ;flag for negative value EndIf dim $p = 0 Do $p = $p + 1 Until Mod(($p * $a), $m) = 1 Or $p = $m if $minu = 1 then $p = $m - $p EndIf ;If $decplaceval <> 0 Then $p = Round($p, $decplaceval) Return $p EndFunc ;_arraymod($a, $m) Returns the the molulo of array $a to modulus $m ;convert negative mod result no. to positive no. ; e.g (-17 Mod 47 ) = (30 Mod 47 ) ; i.e. 47 + (-17) = 30 func _arraymod($a, $m) ; Check for parameter errors. If IsArray($a) = 0 Then Return SetError(1, 1, 0) ; must be array Local $iRows = UBound($a), $iCols = UBound($a, 2), $iDepth = UBound($a, 2) Local $aRET[$iRows][$iCols] For $r = 0 To $iRows - 1 For $c = 0 To $iCols - 1 ;If $decplaceval <> 0 Then ; $aRET[$r][$c] = round(mod($a[$r][$c],$m),$decplaceval) ;Else $aRET[$r][$c] = mod($a[$r][$c],$m) ;EndIf if $m > 0 then If $aRET[$r][$c] < 0 then $aRET[$r][$c] = $m + $aRET[$r][$c] ;convert negative mod result no. to positive no. EndIf Next Next ; --- set deciminal places ------ If $decplaceval <> 0 Then for $x = 0 to $r -1 for $y = 0 to $c -1 $aRET[$x][$y] = Mod(Round($aRET[$x][$y], $decplaceval),$m) Next Next EndIf Return $aRET EndFunc ; Calculates and returns the determinant of matrix $a Func _DetMatrix($a) If UBound($a) <> UBound($a, 2) Then MsgBox(0,"Error"," Matrix must be square to determine Determinant. ROW = "& UBound($a) & " COLUMN = "&UBound($a, 2) ) else Dim $bt, $det = 1 Local $iRows = UBound($a) $temp = upperTriangle($a) $bt = upperTriangle($temp) For $r = 0 To $iRows - 1 $det = $det * $bt[$r][$r] ;MsgBox(0,"det", $iRows & " " &$r & " " & $det) Next $det = $det * $iDF EndIf ;If $decplaceval <> 0 Then $det = Round($det, $decplaceval) return $det EndFunc ; Calculates and returns the matrix which is the adjoint of matrix $a Func matrixAdjoint($a) Local $tms = UBound($a), $ii = 0, $temp = 0, $jj = 0, $ia = 0, $ja = 0, $det = 0, $m = $a ;MsgBox(0,"",$tms) For $i = 0 To $tms -1 For $j = 0 To $tms - 1 $ia = 0 $ja = 0 $ap = MatCreate($tms-1 ,$tms-1 ) $tmsp = UBound($ap) for $ii = 0 to $tms - 1 for $jj = 0 to $tms - 1 if $ii <> $i and $jj <> $j Then $ap[$ia][$ja] = $a[$ii][$jj] $ja = $ja + 1 ;MsgBox(0,"Prim", $ja & " " & $a[$ia][$ja]) EndIf Next if $ii <> $i and $jj <> $j then $ia = $ia + 1 $ja = 0 Next $det = _DetMatrix($ap) $m[$i][$j] = ((-1)^($i + $j)) * $det Next Next $m = matrixTranspose($m) Return $m EndFunc ;=============================== ; matrixInv($a) gives the inverse of Matrix $a ; matrixInv($a, $m) gives the Mudulo inverse of Matrix $a Mudulus $m func matrixInv($a, $m = 0) If UBound($a, 2) <> UBound($a) Then SetError(0) Return -1 EndIf $det = _DetMatrix($a) If $det = 0 Then MsgBox(0,"","Determinant is zero. The inverse of this matrix can not be calculated.") $avRET = 0 Else $ajnt = matrixAdjoint($a) if $m = 0 Then $avRET = _arrayScalarProduct($ajnt, 1/$det) Else ;============== Mod if $m > 0 then $mul = Multinv(mod($det,$m), $m) ;If $decplaceval <> 0 Then $mul = Round($mul, $decplaceval) ;MsgBox(0,"",$mul) $avRET = _arrayScalarProduct($ajnt, $mul) $avRET = _arraymod($avRET,$m) EndIf EndIf EndIf ;===============> End of Mod Section Return $avRET EndFunc ; Func matrixpower($mat, $pow) $ret = $mat If $pow = 0 Then $ret = ArrayProduct($mat, matrixInv($mat)) ElseIf $pow > 0 Then for $x = 1 to $pow -1 $ret = ArrayProduct($ret, $mat) next ElseIf $pow < 0 Then $ret = matrixInv($mat) for $x = 1 to abs($pow) -1 $ret = ArrayProduct($ret, matrixInv($mat)) next EndIf return $ret EndFunc ;each element in Matrix ($mat) to the power of $pow func matrixelementpower($mat, $pow) If IsArray($mat) = 0 Then Return SetError(1, 1, 0) ; must be array Local $iRows = UBound($mat), $iCols = UBound($mat, 2) Local $aRET[$iRows][$iCols] For $r = 0 To $iRows - 1 For $c = 0 To $iCols - 1 $aRET[$r][$c] = power($mat[$r][$c], $pow) Next Next Return $aRET EndFunc ; Two numbers $a^$b $a to the power of $b Func power($a,$b) ConsoleWrite('1st power(a,b = ' & $a & ', ' & $b &@CRLF) ;returns $a to the power of $b If $b = 0 Then Return 1 If $a < 0 Then ; Check for root of a negative number If ($b - int($b)) = 0 Then ;The decimal part of the power is taking the root e.g. 4^(2.5) = 4^2 * 4^(0.5) = 16 * 2 = 32 If Mod($b,2) = 0 Then ; (-$a)*(-$a) = (+$a^2) but (-$a)*(-$a)*(-$a) = (-$a^3) i.e. odd power = neg.result where $a < 0 $a = Abs($a) ConsoleWrite('2nd power(a,b = ' & $a & ', ' & $b &@CRLF) Return abs($a^$b) Else ConsoleWrite('3rd power(a,b = ' & $a & ', ' & $b &@CRLF) Return - abs((Abs($a)^$b)) ; odd = neg. EndIf else return "The result is a complex number" EndIf EndIf ConsoleWrite('4th power(a,b = ' & $a & ', ' & $b &@CRLF) return ($a^$b) EndFunc ;Greatest Common Denominator - Euclid's algorithm. ;(Sarah Flannery, "In Code",Profile Books Ltd,p249-250.) Func gcd($a, $m) Dim $p = 0, $r = 0 $p = Mod($a,$m) ;MsgBox(0,"Prim", $a) If $p = 0 Then $a = $r Else $r = $m Do $b = Mod($r,$p) $r = $p $p = $b Until $b = 0 ;MsgBox(0,"Prim", $r) EndIf Return $r EndFunc ; Given a Number $a returns the factors of that number Func Prim($a) $factors = "" Dim $b, $c If $a > 0 Then If $a <> 0 Then $a = Int($a) While $a / 2 - Int($a / 2) = 0 $a = $a / 2 $factors = $factors & "2 " WEnd $b = 3 $c = ($a)*($a) + 1 Do If $a / $b - Int($a / $b) = 0 Then If $a / $b * $b - $a = 0 Then $factors = $factors & $b & " " $a = $a / $b EndIf EndIf If $a / $b - Int($a / $b) <> 0 Then $b = $b + 2 $c = ($a)*($a) + 1 Until $b > $c Or $b = $c If $a <> 1 Then $factors = $factors & $a & " " EndIf EndIf ;MsgBox(0,"Prim", $factors) Return $factors EndFunc ;===============> End of matrixUDF.au3 file =================================== Edited November 9, 2008 by Malkey Link to comment Share on other sites More sharing options...
Wus Posted February 5, 2008 Share Posted February 5, 2008 (edited) Looks nice! I mean I will still be using Matlab, but looks nice none the less. I'm guessing this was a project for linear algebra or something? Edited February 5, 2008 by Wus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now