<div dir="ltr"><div>Greetings!</div><div><br></div><div>I made a library which implements functions similar to those in Matlab or NumPy. The code is not much clean yet, you can see it at <a href="https://gitlab.com/Hume2/hatlab" target="_blank">https://gitlab.com/Hume2/hatlab</a> . The functions with comments are intended to be used. I want to know if it is a good start or I just wasted time.<br></div><div><br></div><div>The matrices can have arbitrary dimensions, starting from 0D matrices, which are basically scalars. Operations like + - * / are element-wise. I also implemented broadcasting of these operations.</div><div><br></div><div>I also implemented indexing. Some examples:</div><div><br></div><div>a = matrix2D [[1,2,3],[4,5,6],[7,8,9]]</div><div>a !# [2,2] -- element at index [2,2]</div><div>a !$ [At 1, All] -- 1st row</div><div>a !$ [To (-1), All] -- all rows except the last one</div><div>a !$ [Where $ a ># 5] -- all elements bigger than 5 (The ># operator returns a matrix of bools, I will come to that later.)</div><div><br></div><div>It is also possible to update a matrix. These operations do not copy all the elements from the original matrix, they just make another matrix which points to the original matrix at places where it was not changed. Some examples:</div><div><br></div><div>a = eye 5</div><div>b = matrix2D [[1,2,3],[4,5,6],[7,8,9]]</div><div>a !:[FromTo 1 4, FromTo 1 4]:= b -- replace the middle square by a different matrix</div><div>a !:[FromTo 1 4, FromTo 1 4]:= 1 -- set all values in the middle square to 1</div><div>a !:[FromTo 1 4, FromTo 1 4]:+= 1 -- add one to all values in the middle square</div><div>a !:[FromTo 1 4, FromTo 1 4]:$= cos -- replace all values in the middle square by their cosine</div><div><br></div><div>Operators are broadcasted the same way as in Matlab or NumPy. If one operand has size 1 and the other one has size N or vice-versa in given dimension, the operator acts as if the thinner matrix was repeated in the given dimension N times. Example:</div><div><br></div><div>a = matrix1D [10, 20, 30] -- row vector<br></div><div>b = matrix2D [[1], [2], [3]] -- column vector<br></div><div>a + b -- returns [[11, 21, 31], [12, 22, 32], [13, 23, 33]]</div><div><br></div><div>There is a function "scalar" which creates a 0D matrix out of any value, so we can do:</div><div><br></div><div>a + (scalar 5) -- returns [15, 25, 35]</div><div><div>a * (scalar 2) -- returns [20, 40, 60]<br><br></div></div><div>If a type is in the class Num, Fractional or Floating, the matrix of the given type is also in the given class. Conversions are performed using the function "scalar", so we can write:</div><div><br></div><div>a + 5</div><div>a * 2<br></div><div><br></div><div>because the "5" and "2" are then interpreted as 0D matrices.</div><div><br></div><div>Operator * is interpreted as element-wise multiplication. To do matrix multiplication, use the × operator. It can be also used to multiply matrices with vectors. Examples:</div><div><br></div><div>v = matrix1D [1,2,3]</div><div>m = matrix2D [[1,0,1],[2,-1,1],[0,1,-1]]</div><div>v × m -- multiply row vector v with matrix m</div><div>m × v -- multiply matrix m with column vector v</div><div>m × m -- multiply matrix m by itself</div><div><br></div><div>There are also functions for element-wise boolean operations. They work similarly and they have the # suffix. Examples:<br></div><div><br></div><div>a = matrix2D [[True, True], [False, False]]</div><div>b = matrix2D [[True, False], [True, False]]</div><div>a &# b -- element-wise and</div><div>a |# b -- element-wise or</div><div><br></div><div>There are also element-wise comparison functions in a similar fashion. Examples:</div><div><br></div><div>a = eye 3<br></div><div>b = ones [3,3]</div><div>a ==# b -- returns a matrix of bools saying where the element of matrix a is equal to the corresponding element in matrix b.</div><div>a <# b -- similar as above except that it tests for being less than instead of equality.</div><div>a ==# 1 -- Broadcasting works for these operators too, so this syntax is valid also.<br></div><div><br></div><div>There are also other functions not described in this mail. I will not describe them here because this mail is already too long. Don't worry asking me if you don't understand the meaning of any function from my comments.</div><div><br></div><div>I did not implement any algorithms for linear equation solving, not even any other matrix algorithms yet. If this library has any potential, I may do that in the future.<br></div><div><br></div><div>Please, let me know if this library has any potential or it was just a waste of time.</div><div><br></div><div>Hume2<br></div></div>