Transpose an arbitrarily sized rectangular Matrix.




Procedure transposeMatrix(Array a(2), Array trans(2))
  Protected rows, cols
 
  Protected ar = ArraySize(a(), 1) ;rows in original matrix
  Protected ac = ArraySize(a(), 2) ;cols in original matrix
 
  ;size the matrix receiving the transposition
  Dim trans(ac, ar)
 
  ;copy the values
  For rows = 0 To ar
    For cols = 0 To ac
      trans(cols, rows) = a(rows, cols)
    Next
  Next  
EndProcedure
 
Procedure displayMatrix(Array a(2), text.s = "")
  Protected i, j 
  Protected cols = ArraySize(a(), 2), rows = ArraySize(a(), 1)
 
  PrintN(text + ": (" + Str(rows + 1) + ", " + Str(cols + 1) + ")")
  For i = 0 To rows
    For j = 0 To cols
      Print(LSet(Str(a(i, j)), 4, " "))
    Next
    PrintN("")
  Next
  PrintN("")
EndProcedure
 
;setup a matrix of arbitrary size
Dim m(random(5), random(5))
 
Define rows, cols
;fill matrix with 'random' data
For rows = 0 To ArraySize(m(),1)      ;ArraySize() can take a dimension as its second argument
  For cols = 0 To ArraySize(m(), 2)
    m(rows, cols) = random(10) - 10 
  Next
Next
 
Dim t(0,0) ;this will be resized during transposition
If OpenConsole()
  displayMatrix(m(), "matrix before transposition")
  transposeMatrix(m(), t())
  displayMatrix(t(), "matrix after transposition")
 
  Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
  Input()
  CloseConsole()
EndIf