Rows/columns operation in Jitter or Gen


    Mar 17 2016 | 11:34 am
    Hi folks!
    Is there a way to do matrix operation like:
    1. Multiply N×M by 1×M matrix (multiply each row value from the 1st matrix by the corresponding value from the second). 2. Calculate mean of each row.
    This can be done with jit.spill/jit.fill, but I'm looking for a more FTM- or Matlab-like way on doing this for the whole matrices without doing loops on the scheduler/queue.
    I checked the forum briefly and didn't find a solution. Also I'm new to Gen and don't see a way to do this, because in Gen (as far as I understand) we make the algorithm to be evaluated on each pixel. I don't see a way to do more classical looping techniques there.
    Any help is appreciated.
    Best, E.

    • Mar 17 2016 | 6:59 pm
      for mean, check out jit.planeop for matrix multiply, check out jit.la.mult
      jit.gen has a sample operator, allowing you to access the values of all the pixels of the input matrix, and codebox allows you to do branching and looping. check out the GenExpr reference doc for more info.
    • Mar 18 2016 | 7:48 pm
      I think for calculating the mean of each row jit.dimop would be more useful.
    • Mar 19 2016 | 1:34 pm
      jit.dimop is exactly what I needed! Thanks @jesse!
      @rob, I didn't get how to use jit.la.mult for my task: I need to multiply values from each row from the first matrix by the value from the corresponding row from the second matrix. The output will be the matrix with N×M dimensions. jit.la.mult outputs 1×M.
      Also, will the looping inside codebox be evaluated for each pixel?
      And another question: how to calculate amount of zeros in each row?
    • Mar 21 2016 | 12:11 am
      As long as the larger dim matrix enters the left inlet of a jit.* object it should do the multiplication as you expect.
    • Apr 15 2021 | 7:43 am
      A bit late,
      but here's a simple way to count the number of zeroes per row, using the jit.dimop object, if you still need it :-)
      Regards - Svend
    • Apr 15 2021 | 8:27 am
      Another note,
      the jit.la.mult object cares about the order of the inputs, and their respective sizes (true matrix multiplication).
      A * B wont give you the same result as B * A.
      if you're getting a 1xM size matrix after jit.la.mult,
      try reversing the order of the matrices, and/or consider using jit.transpose, if you need to rotate / transpose one of the matrices, in order to get the proper orientation before multiplication.
      In other words, if the jit.la.mult complains about "mismatch dim" in the max console, the multiplication doesn't make sense. Here's a couple of examples, resulting in various output matrix sizes after jit.la.mult.
      Jit.la.mult is very useful when working with machine learning algorithms, ie. for calculating covariance matrices, in principal component analysis algorithms,
      or when calculating basic distance matrices (self-similarity matrices).
      Hope this helps
      - Svend
    • May 04 2021 | 10:15 am
      Thank you@ @GUSSI for the enlightment !
    • May 04 2021 | 11:48 pm
      @GUSSI, that's some serious wizarding. Many thanks for this quality educational material.