@@ -565,6 +565,75 @@ class MatrixExtensionSuite extends FunSuite:
565565 assertVecEquals[Double ](result.raw, NArray [Double ](2.0 , 0.0 , 0.0 , 0.0 , 2.0 , 0.0 , 0.0 , 0.0 , 2.0 ))
566566 }
567567
568+ test(" hadamard product with non-simple layout" ) {
569+ // Create base matrices
570+ val base1 = Matrix [Double ](NArray .tabulate[Double ](9 )(i => (i + 1 ).toDouble), 3 , 3 )
571+ val base2 = Matrix [Double ](NArray .tabulate[Double ](9 )(i => (i + 10 ).toDouble), 3 , 3 )
572+
573+ // Create views with non-simple layouts
574+ val view1 = base1(:: , NArray (1 , 2 )) // columns 1 and 2
575+ val view2 = base2(:: , NArray (1 , 2 )) // columns 1 and 2
576+
577+ // Compute hadamard product
578+ val result = view1.hadamard(view2)
579+
580+ // Expected values (column-major):
581+ // view1 columns 1,2 of base1 = [[4,7], [5,8], [6,9]]
582+ // view2 columns 1,2 of base2 = [[13,16], [14,17], [15,18]]
583+ // hadamard should give element-wise multiplication
584+ assert(result.rows == 3 )
585+ assert(result.cols == 2 )
586+ assertEqualsDouble(result(0 , 0 ), 4.0 * 13.0 , 0.0001 ) // 52
587+ assertEqualsDouble(result(1 , 0 ), 5.0 * 14.0 , 0.0001 ) // 70
588+ assertEqualsDouble(result(2 , 0 ), 6.0 * 15.0 , 0.0001 ) // 90
589+ assertEqualsDouble(result(0 , 1 ), 7.0 * 16.0 , 0.0001 ) // 112
590+ assertEqualsDouble(result(1 , 1 ), 8.0 * 17.0 , 0.0001 ) // 136
591+ assertEqualsDouble(result(2 , 1 ), 9.0 * 18.0 , 0.0001 ) // 162
592+ }
593+
594+ test(" hadamard product with mixed layouts" ) {
595+ // One matrix with simple layout, one with non-simple
596+ val simple = Matrix [Double ](NArray (1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ), 3 , 2 )
597+ val base = Matrix [Double ](NArray .tabulate[Double ](9 )(i => (i + 10 ).toDouble), 3 , 3 )
598+ val view = base(:: , NArray (0 , 2 )) // columns 0 and 2
599+
600+ val result = simple.hadamard(view)
601+
602+ assert(result.rows == 3 )
603+ assert(result.cols == 2 )
604+ assertEqualsDouble(result(0 , 0 ), 1.0 * 10.0 , 0.0001 )
605+ assertEqualsDouble(result(1 , 0 ), 2.0 * 11.0 , 0.0001 )
606+ assertEqualsDouble(result(2 , 0 ), 3.0 * 12.0 , 0.0001 )
607+ assertEqualsDouble(result(0 , 1 ), 4.0 * 16.0 , 0.0001 )
608+ assertEqualsDouble(result(1 , 1 ), 5.0 * 17.0 , 0.0001 )
609+ assertEqualsDouble(result(2 , 1 ), 6.0 * 18.0 , 0.0001 )
610+ }
611+
612+ test(" hadamard product with transposed matrix" ) {
613+ val mat1 = Matrix [Double ](NArray (1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ), 2 , 3 )
614+ val mat2 = Matrix [Double ](NArray (10.0 , 20.0 , 30.0 , 40.0 , 50.0 , 60.0 ), 3 , 2 )
615+
616+ // Transpose mat2 to have the same shape as mat1
617+ val mat2T = mat2.transpose
618+
619+ assert(mat1.rows == mat2T.rows)
620+ assert(mat1.cols == mat2T.cols)
621+
622+ val result = mat1.hadamard(mat2T)
623+
624+ assert(result.rows == 2 )
625+ assert(result.cols == 3 )
626+ // mat1 (col-major 2x3): [[1,3,5], [2,4,6]]
627+ // mat2 (col-major 3x2): [[10,40], [20,50], [30,60]]
628+ // mat2T (row-major 2x3): [[10,20,30], [40,50,60]]
629+ assertEqualsDouble(result(0 , 0 ), 1.0 * 10.0 , 0.0001 ) // 10
630+ assertEqualsDouble(result(1 , 0 ), 2.0 * 40.0 , 0.0001 ) // 80
631+ assertEqualsDouble(result(0 , 1 ), 3.0 * 20.0 , 0.0001 ) // 60
632+ assertEqualsDouble(result(1 , 1 ), 4.0 * 50.0 , 0.0001 ) // 200
633+ assertEqualsDouble(result(0 , 2 ), 5.0 * 30.0 , 0.0001 ) // 150
634+ assertEqualsDouble(result(1 , 2 ), 6.0 * 60.0 , 0.0001 ) // 360
635+ }
636+
568637 test(" map rows" ) {
569638 val mapped = mat1to9.mapRows[Double ](row => row * 2 )
570639 assertVecEquals[Double ](mapped.raw, mat1to9.raw * 2 )
0 commit comments