Jump to content

Matrix Generate Script


logmein
 Share

Recommended Posts

Hi there!

I have been learning linear algebra in my university for months. The subject was rather hard, I did't understand it much so I sent a email to my teacher to ask him. But I realized that typing a matrix by text was extremely hard. I don't want to make a LaTex function, save to a file, attach it to the mail, bla bla bla!!! It's complicated! So I spent 2 hours yesterday to make this tool. Just type the number of lines and columns and matrix values, it will generate a quite nice matrix in ASCII characters :)

Enjoy!

Notes: It will rearrage your numbers to straight columns.

1x1 will cause error.

ConsoleWrite (@CRLF & '------------------------------------MATRIX TEST-----------------------------------------' &@CRLF)
Dim $c = 6;column
Dim $l = 4;line
Dim $n = '1,6,2,4,b,a,7,6,6,0,44,4,6,3,6,2,6,8,9,6,6,1,2,logmein'

$split = StringSplit ($n,',')
If $c * $l <> $split[0] Then
ConsoleWrite ('! Matrix values number do not match the columns and lines !' & @CRLF)
Exit
EndIf

Dim $char[$l][$c], $len[$l][$c], $maxlen[$c][3]



For $i = 0 To $l-1
For $u = 0 To $c -1
$v = $i*($c) + $u +1
$char[$i][$u] = $split[$v]
$len[$i][$u] = StringLen ($split[$v])
If $len[$i][$u] > $maxlen[$u][0] Then
$maxlen[$u][0] = $len[$i][$u]
$maxlen[$u][1] = $i
$maxlen[$u][2] = $u
EndIf
Next
Next

Local $finallen

For $u = 0 To $c - 1
$finallen += $maxlen[$u][0]
Next

ConsoleWrite (' _' & _Repeat(' ',$finallen + $c) & '_' & @CRLF)

For $i = 0 To $l-1;write lines
For $u = 0 To $c-1;write columns
$v = $i*($c) + $u +1
$char[$i][$u] = $split[$v]
Switch $u
Case 0; the first column
If StringLen ($char[$i][$u])<$maxlen[$u][0] Then
ConsoleWrite ('| ' & $char[$i][$u] & _Repeat(' ', $maxlen[$u][0]-StringLen ($char[$i][$u])+1))
Else

ConsoleWrite ('| ' & $char[$i][$u] & ' ')
EndIf

Case 1 To $c-2 ;middle columns
If $i > 0 Then
If StringLen ($char[$i][$u]) < $maxlen[$u][0] Then
ConsoleWrite ($char[$i][$u] & _Repeat(' ', $maxlen[$u][0]-StringLen ($char[$i][$u])+1))
Else
ConsoleWrite ($char[$i][$u] & ' ' )
EndIf
Else
If StringLen ($char[$i][$u]) < $maxlen[$u][0] Then
ConsoleWrite ($char[$i][$u] & _Repeat(' ', $maxlen[$u][0]-StringLen ($char[$i][$u])+1))
Else
ConsoleWrite ($char[$i][$u] & ' ' )
EndIf
EndIf


Case Else ; the last column
If StringLen ($char[$i][$u])<$maxlen[$u][0] Then
ConsoleWrite ($char[$i][$u] & _Repeat(' ', $maxlen[$u][0]-StringLen ($char[$i][$u])+1) & ' |' & @CRLF)
Else
ConsoleWrite ($char[$i][$u] & ' |' & @CRLF)
EndIf
EndSwitch

Next
Next


ConsoleWrite ('|_' & _Repeat(' ',$finallen + $c ) & '_|' & @CRLF)


Func _Repeat($chars, $times);repeat a character in a specified time
Local $rChar
For $a = 1 To $times
$rChar &= $chars
Next
Return $rChar
EndFunc ;==>_Repeat
Edited by logmein
Link to comment
Share on other sites

I have examples with 0 posts and 0 stars, so what is the problem?

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

No one cares?

Mod, please close this thread.

wah! :

Just like guinness said...

I have examples with 0 posts and 0 stars, so what is the problem?

We all experience this. If your intent was to get some sort of accolade from the community, better get used to disappointment.

Asking for a mod to close the post because you are un-pleased with the response demonstrates a lack of respect for the forum and is frankly a waste of time.

Who knows...maybe one day a member will come across your post and find it useful. I've experienced acknowledgment years after some of my posts.

Edited by spudw2k
Link to comment
Share on other sites

logmein,

People not commenting on this script just means that whomever is reading it has nothing to say, it is not a reflection on you or the script. As spudw2k said, sometime in the future someone may run across this and need something from it.

With that in mind, I would like to show you another way to do this. Please accept this as intended, instructional only.

#include <GUIConstantsEx.au3>
#include <windowsConstants.au3>
#include <StaticConstants.au3>
#include <editConstants.au3>

local $str
local $numcols = 5          ; inital # columns
local $numents = 100        ; number of test entries to generate
local $entlngth= 5          ; length of each test entry

local $gui010   =   guicreate('Display Matrix',500)
local $size     =   WinGetClientSize($gui010)
local $edt010   =   guictrlcreateedit('',0,0,$size[0],$size[1]-30, bitor($es_readonly,$ws_hscroll, $ws_vscroll))
                    guictrlsetfont(-1,10,800,default,'courier new')
                    guictrlcreatelabel('Number of columns:',10,$size[1]-25,120,20)
                    guictrlsetfont(-1,8.5,600,default,'Lucinda Console')
local $inp010   =   guictrlcreateinput($numcols,130,$size[1]-25,40,20)
local $btn010   =   guictrlcreatebutton('Display Matrix',190,$size[1]-25,130,20)
                    guictrlsetfont(-1,10,800)
                    guictrlsetcolor(-1,0xaa0000)
local $btn020   =   guictrlcreatebutton('Re-Gen String  ',350,$size[1]-25,130,20)
                    guictrlsetfont(-1,10,800)
                    guictrlsetcolor(-1,0xaa0000)
guisetstate()

_GenRandomString()

While 1

    switch guigetmsg()
        case $gui_event_close
            Exit
        case $btn010
            _DisplayMatrix()
        case $btn020
            _GenRandomString()
            _DisplayMatrix()
    EndSwitch

wend

func _DisplayMatrix()

    local $a10 = stringsplit($str,','), $out = '',$numcols = guictrlread($inp010)
    guictrlsetdata($edt010,'')
    for $1 = 1 to $a10[0]

        ; $numcols is the number of columns per row.  This is controlled by using
        ; modulo integer arithmetic to insert a carrige return/line feed when we have processed $colnum entries
        ; from the input, in this case an array.
        ; The strings are padded using the stringformat function (similar to sprintf in "c")

        if mod($1,$numcols) = 0 then
            $out &= stringformat('%-' & $entlngth+3 & 's',$a10[$1]) & @crlf
        else
            $out &= stringformat('%-' & $entlngth+3 & 's',$a10[$1])
        endif
    Next

    guictrlsetdata($edt010,$out)

endfunc

func _GenRandomString()

    $str = ''
    for $1 = 1 to $numents
        for $2 = 1 to random(1,$entlngth,1)
            $str &= chr(random(65,90,1))
        next
        $str &= ','
    Next

endfunc

kylomas

edit: corrected spacing control

Edited by kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

Personally, I prefer right aligned columns in the matrix display.

Local $c = 6 ; column
Local $l = 4 ; line
Local $Mat = '1,666,2,4,b,a,7,6,6,0,44,4,6,3,6,2,6,8,9,6,6,1,2,logmein'

ConsoleWrite(@CRLF & '------------------------------------MATRIX TEST (Right aligned) -----------------------------------------' & @CRLF)
_MatrixDisplay($Mat) ; Right aligned

ConsoleWrite(@CRLF & '------------------------------------MATRIX TEST (Left aligned) -----------------------------------------' & @CRLF)
_MatrixDisplay($Mat, 0) ; Left Aligned


Func _MatrixDisplay(ByRef $n, $iRightAlign = 1)
    Local $split = StringSplit($n, ',')

    ; Find array of Max. column width for each column.
    Local $aMax[$c]
    For $i = 1 To $split[0]
        If StringLen($split[$i]) > $aMax[Mod($i - 1, $c)]Then $aMax[Mod($i - 1, $c)] = StringLen($split[$i])
    Next

    ; Add appropiate number of spaces to each element depending on which column the element is in.
    Local $iRowLen = 0
    For $i = 1 To $split[0]
        If $iRightAlign = 1 Then
            $split[$i] = StringRight(_Repeat(" ", $aMax[Mod($i - 1, $c)] + 1) & $split[$i], $aMax[Mod($i - 1, $c)] + 1) ; Right aligned
        Else
            $split[$i] = StringLeft($split[$i] & _Repeat(" ", $aMax[Mod($i - 1, $c)] + 1), $aMax[Mod($i - 1, $c)] + 1) ; Left aligned
        EndIf
        If $i <= $c Then $iRowLen += StringLen($split[$i]) ; For use in top and bottom matrix display.
    Next

    ; Create matrix display
    Local $sMatrix = " _" & _Repeat(" ", $iRowLen) & "_" & @CRLF
    For $i = 1 To $l
        $sMatrix &= "| "
        For $u = 1 To $c
            $sMatrix &= $split[(($i - 1) * $c) + $u]
        Next
        $sMatrix &= " |" & @CRLF
    Next
    $sMatrix &= " -" & _Repeat(" ", $iRowLen) & "-" & @CRLF

    ConsoleWrite($sMatrix & @LF)
EndFunc   ;==>_MatrixDisplay

Func _Repeat($chars, $times);repeat a character in a specified time
    Local $rChar
    For $a = 1 To $times
        $rChar &= $chars
    Next
    Return $rChar
EndFunc   ;==>_Repeat
Link to comment
Share on other sites

@Malkey and @kylomas

Wow, thanks for your scripts! It's nice and simple! :thumbsup: :thumbsup:

@spudw2k

Uhm, I understood. Thanks! :bye:

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...