ToUserdata

Matrices are, per default, tables of tables in Lua. When algebraic operations are performed on them, they are repeatedly copied and moved, which can lead to severe performance issues if the matrices are large objects.

A call of Matrix.ToUserdata($M$) takes a matrix and transforms it, from Lua's point of view, from a table of tables to a mere pointer, which it returns. This means that the object still has all functionalities Quanty defines on it, but with increased performance. The downside is that any functionalities Lua defines on tables are not necessarily available any more.

The inverse operation of Matrix.ToUserdata() is Matrix.ToTable().

Example

Input

Example.Quanty
--This creates a table of tables
A = Matrix.Random({-2,2},{10000,10000})
setmetatable(A, MatrixMeta)
 
TimeStart("Table of Tables")
B = Matrix.Transpose(A)
B = Matrix.Conjugate(B)
B = Matrix.ConjugateTranspose(B)
B = B - A
print(B[1][1])
TimeEnd("Table of Tables")
 
AUData = Matrix.ToUserdata(A)
--A is, after this point, no longer needed.
A = nil
B = nil
collectgarbage()
 
TimeStart("Userdata")
B = Matrix.Transpose(AUData)
B = Matrix.Conjugate(B)
B = Matrix.ConjugateTranspose(B)
B = B - AUData
--In case we want to access the first element.
B = Matrix.ToTable(B)
print(B[1][1])
TimeEnd("Userdata")
 
TimePrint()

Result

0
0
Timing results
   Total_time | NumberOfRuns | Running | Name
      0:00:13 |            1 |       0 | Table of Tables
      0:00:02 |            1 |       0 | Userdata

Table of contents

Print/export