# [Haskell-cafe] Matlab Style Logic Operations ala V1.*(V2>0) on Vectors and Matrices with HMatrix ??

Henning Thielemann lemming at henning-thielemann.de
Thu Dec 23 00:18:47 CET 2010

```On Wed, 22 Dec 2010, gutti wrote:

> question 1.  u see the two commented lines I tried to get ur original line
> running, but didn't know how to specify f

What 'f' ? Do you mean

matrixfunction f x y = liftMatrix2 (zipVectorWith f) x y

?

> ## Code ########
>
> import Numeric.LinearAlgebra
> import Graphics.Plot
>
> matrix1 = fromLists [[0 .. 5],[30 .. 35],[50 .. 55]]
> matrix2 = fromLists [[-1,2],[-3,4],[5,-6]]
>
> -- matrix1 = buildMatrix 3 4 ( (r,c) -> fromIntegral r * fromIntegral c)
> (3><4)
> -- posPart v  =  mapVector (\a -> if a>=0 then a else 0) v
>
> -- function2map a1 a2 = (\a1 a2 -> if a1>=0 then a2/a1 else a1/a2)
> matrixfunction x y = liftMatrix2 (zipVectorWith(\a1 a2 -> if a2>=0 then a1 else 0)) x y

> matrix3 = matrixfunction matrix1 matrix2
>
> disp = putStr . disps 2
>
> main = do
>
>  disp matrix1
>  disp matrix2
> --  disp matrix3
>  mesh matrix1
>
>
> #########
>
>
> question 2: - the compiler comes up with some weired data type problem --
> ghci has no problem this line :
>
> matrixTest_Fail.hs:5:10:
>    Ambiguous type variable `t' in the constraints:
>      `Element t'
>        arising from a use of `fromLists' at matrixTest_Fail.hs:5:10-38
>      `Num t' arising from the literal `1' at matrixTest_Fail.hs:5:22
>    Possible cause: the monomorphism restriction applied to the following:
>      matrix2 :: Matrix t (bound at matrixTest_Fail.hs:5:0)
>    Probable fix: give these definition(s) an explicit type signature
>                  or use -XNoMonomorphismRestriction
>
> ## Code #####
>
> import Numeric.LinearAlgebra
> import Graphics.Plot
>
> matrix1 = fromLists [[1,2],[3,4],[5,6]]
> matrix2 = fromLists [[1,2],[3,4],[5,6]]

Before type inference can work, you need to fix the type of at least one
number of a set of numbers with known equal type. E.g.

> matrix1 = fromLists [[1,2],[3,4],[5,6::Double]]

or even better, add a type signature:

matrix1 :: Matrix Double

```