@@ -363,3 +363,214 @@ module MatrixVectorAddEdgeCaseTests =
363363 let result = Matrix.addColVector mat v
364364 let expected = [| 101.0 ; 102.0 ; 103.0 ; 204.0 ; 205.0 ; 206.0 |]
365365 Assert.Equal< Vector< float>>( expected, result.Data)
366+
367+
368+ // ----------------------------------------------------------------------
369+ /// Tests for Matrix.GetSlice(Range, Range) - the F# Range-based slice syntax
370+ /// This tests the convenient mat.[ r1..r2, c1..c2] syntax
371+ module MatrixRangeGetSliceTests =
372+
373+ [<Fact>]
374+ let ``GetSlice Range - full range with .. operator`` () =
375+ let mat = matrix [|
376+ [| 1.0 ; 2.0 ; 3.0 |]
377+ [| 4.0 ; 5.0 ; 6.0 |]
378+ [| 7.0 ; 8.0 ; 9.0 |]
379+ |]
380+ // Using 0.. to get full matrix
381+ let slice = mat.[ 0 .., 0 ..]
382+ Assert.Equal( 3 , slice.NumRows)
383+ Assert.Equal( 3 , slice.NumCols)
384+ Assert.Equal< Vector< float>>([| 1.0 ; 2.0 ; 3.0 ; 4.0 ; 5.0 ; 6.0 ; 7.0 ; 8.0 ; 9.0 |], slice.Data)
385+
386+ [<Fact>]
387+ let ``GetSlice Range - explicit start and end indices`` () =
388+ let mat = matrix [|
389+ [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
390+ [| 5.0 ; 6.0 ; 7.0 ; 8.0 |]
391+ [| 9.0 ; 10.0 ; 11.0 ; 12.0 |]
392+ [| 13.0 ; 14.0 ; 15.0 ; 16.0 |]
393+ |]
394+ // Extract middle 2x2: mat.[1..2, 1..2]
395+ let slice = mat.[ 1 .. 2 , 1 .. 2 ]
396+ Assert.Equal( 2 , slice.NumRows)
397+ Assert.Equal( 2 , slice.NumCols)
398+ Assert.Equal< Vector< float>>([| 6.0 ; 7.0 ; 10.0 ; 11.0 |], slice.Data)
399+
400+ [<Fact>]
401+ let ``GetSlice Range - from start to specific index`` () =
402+ let mat = matrix [|
403+ [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
404+ [| 5.0 ; 6.0 ; 7.0 ; 8.0 |]
405+ [| 9.0 ; 10.0 ; 11.0 ; 12.0 |]
406+ |]
407+ // Get first 2 rows, first 3 cols: mat.[..1, ..2]
408+ let slice = mat.[.. 1 , .. 2 ]
409+ Assert.Equal( 2 , slice.NumRows)
410+ Assert.Equal( 3 , slice.NumCols)
411+ Assert.Equal< Vector< float>>([| 1.0 ; 2.0 ; 3.0 ; 5.0 ; 6.0 ; 7.0 |], slice.Data)
412+
413+ [<Fact>]
414+ let ``GetSlice Range - from specific index to end`` () =
415+ let mat = matrix [|
416+ [| 1.0 ; 2.0 ; 3.0 |]
417+ [| 4.0 ; 5.0 ; 6.0 |]
418+ [| 7.0 ; 8.0 ; 9.0 |]
419+ |]
420+ // Get last 2 rows, last 2 cols: mat.[1.., 1..]
421+ let slice = mat.[ 1 .., 1 ..]
422+ Assert.Equal( 2 , slice.NumRows)
423+ Assert.Equal( 2 , slice.NumCols)
424+ Assert.Equal< Vector< float>>([| 5.0 ; 6.0 ; 8.0 ; 9.0 |], slice.Data)
425+
426+ [<Fact>]
427+ let ``GetSlice Range - single row range`` () =
428+ let mat = matrix [|
429+ [| 1.0 ; 2.0 ; 3.0 |]
430+ [| 4.0 ; 5.0 ; 6.0 |]
431+ [| 7.0 ; 8.0 ; 9.0 |]
432+ |]
433+ // Extract middle row: mat.[1..1, 0..]
434+ let slice = mat.[ 1 .. 1 , 0 ..]
435+ Assert.Equal( 1 , slice.NumRows)
436+ Assert.Equal( 3 , slice.NumCols)
437+ Assert.Equal< Vector< float>>([| 4.0 ; 5.0 ; 6.0 |], slice.Data)
438+
439+ [<Fact>]
440+ let ``GetSlice Range - single column range`` () =
441+ let mat = matrix [|
442+ [| 1.0 ; 2.0 ; 3.0 |]
443+ [| 4.0 ; 5.0 ; 6.0 |]
444+ [| 7.0 ; 8.0 ; 9.0 |]
445+ |]
446+ // Extract middle column: mat.[0.., 1..1]
447+ let slice = mat.[ 0 .., 1 .. 1 ]
448+ Assert.Equal( 3 , slice.NumRows)
449+ Assert.Equal( 1 , slice.NumCols)
450+ Assert.Equal< Vector< float>>([| 2.0 ; 5.0 ; 8.0 |], slice.Data)
451+
452+ [<Fact>]
453+ let ``GetSlice Range - mixed start and end operators`` () =
454+ let mat = matrix [|
455+ [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
456+ [| 5.0 ; 6.0 ; 7.0 ; 8.0 |]
457+ [| 9.0 ; 10.0 ; 11.0 ; 12.0 |]
458+ [| 13.0 ; 14.0 ; 15.0 ; 16.0 |]
459+ |]
460+ // Rows from start to 2, cols from 1 to end: mat.[..2, 1..]
461+ let slice = mat.[.. 2 , 1 ..]
462+ Assert.Equal( 3 , slice.NumRows)
463+ Assert.Equal( 3 , slice.NumCols)
464+ Assert.Equal< Vector< float>>([| 2.0 ; 3.0 ; 4.0 ; 6.0 ; 7.0 ; 8.0 ; 10.0 ; 11.0 ; 12.0 |], slice.Data)
465+
466+ [<Fact>]
467+ let ``GetSlice Range - first row only`` () =
468+ let mat = matrix [|
469+ [| 1.0 ; 2.0 ; 3.0 |]
470+ [| 4.0 ; 5.0 ; 6.0 |]
471+ [| 7.0 ; 8.0 ; 9.0 |]
472+ |]
473+ // First row: mat.[0..0, 0..]
474+ let slice = mat.[ 0 .. 0 , 0 ..]
475+ Assert.Equal( 1 , slice.NumRows)
476+ Assert.Equal( 3 , slice.NumCols)
477+ Assert.Equal< Vector< float>>([| 1.0 ; 2.0 ; 3.0 |], slice.Data)
478+
479+ [<Fact>]
480+ let ``GetSlice Range - last row only`` () =
481+ let mat = matrix [|
482+ [| 1.0 ; 2.0 ; 3.0 |]
483+ [| 4.0 ; 5.0 ; 6.0 |]
484+ [| 7.0 ; 8.0 ; 9.0 |]
485+ |]
486+ // Last row: mat.[2..2, 0..]
487+ let slice = mat.[ 2 .. 2 , 0 ..]
488+ Assert.Equal( 1 , slice.NumRows)
489+ Assert.Equal( 3 , slice.NumCols)
490+ Assert.Equal< Vector< float>>([| 7.0 ; 8.0 ; 9.0 |], slice.Data)
491+
492+ [<Fact>]
493+ let ``GetSlice Range - first column only`` () =
494+ let mat = matrix [|
495+ [| 1.0 ; 2.0 ; 3.0 |]
496+ [| 4.0 ; 5.0 ; 6.0 |]
497+ [| 7.0 ; 8.0 ; 9.0 |]
498+ |]
499+ // First column: mat.[0.., 0..0]
500+ let slice = mat.[ 0 .., 0 .. 0 ]
501+ Assert.Equal( 3 , slice.NumRows)
502+ Assert.Equal( 1 , slice.NumCols)
503+ Assert.Equal< Vector< float>>([| 1.0 ; 4.0 ; 7.0 |], slice.Data)
504+
505+ [<Fact>]
506+ let ``GetSlice Range - last column only`` () =
507+ let mat = matrix [|
508+ [| 1.0 ; 2.0 ; 3.0 |]
509+ [| 4.0 ; 5.0 ; 6.0 |]
510+ [| 7.0 ; 8.0 ; 9.0 |]
511+ |]
512+ // Last column: mat.[0.., 2..2]
513+ let slice = mat.[ 0 .., 2 .. 2 ]
514+ Assert.Equal( 3 , slice.NumRows)
515+ Assert.Equal( 1 , slice.NumCols)
516+ Assert.Equal< Vector< float>>([| 3.0 ; 6.0 ; 9.0 |], slice.Data)
517+
518+ [<Fact>]
519+ let ``GetSlice Range - tall matrix slice`` () =
520+ let mat = Matrix.init< float> 8 4 ( fun i j -> float ( i * 4 + j))
521+ // Get rows 2 to 5, cols 1 to 3: mat.[2..5, 1..3]
522+ let slice = mat.[ 2 .. 5 , 1 .. 3 ]
523+ Assert.Equal( 4 , slice.NumRows)
524+ Assert.Equal( 3 , slice.NumCols)
525+ // Verify first row of slice (row 2 of original, cols 1-3)
526+ Assert.Equal( 9.0 , slice.[ 0 , 0 ]) // mat.[2, 1]
527+ Assert.Equal( 10.0 , slice.[ 0 , 1 ]) // mat.[2, 2]
528+ Assert.Equal( 11.0 , slice.[ 0 , 2 ]) // mat.[2, 3]
529+
530+ [<Fact>]
531+ let ``GetSlice Range - wide matrix slice`` () =
532+ let mat = Matrix.init< float> 3 10 ( fun i j -> float ( i * 10 + j))
533+ // Get all rows, cols 3 to 7: mat.[0.., 3..7]
534+ let slice = mat.[ 0 .., 3 .. 7 ]
535+ Assert.Equal( 3 , slice.NumRows)
536+ Assert.Equal( 5 , slice.NumCols)
537+ // Verify first row
538+ let firstRow = slice.[ 0 .. 0 , 0 ..]
539+ Assert.Equal< Vector< float>>([| 3.0 ; 4.0 ; 5.0 ; 6.0 ; 7.0 |], firstRow.Data)
540+
541+ [<Fact>]
542+ let ``GetSlice Range - single element as 1x1 matrix`` () =
543+ let mat = matrix [|
544+ [| 1.0 ; 2.0 ; 3.0 |]
545+ [| 4.0 ; 5.0 ; 6.0 |]
546+ [| 7.0 ; 8.0 ; 9.0 |]
547+ |]
548+ // Extract center element as 1x1 matrix: mat.[1..1, 1..1]
549+ let slice = mat.[ 1 .. 1 , 1 .. 1 ]
550+ Assert.Equal( 1 , slice.NumRows)
551+ Assert.Equal( 1 , slice.NumCols)
552+ Assert.Equal< Vector< float>>([| 5.0 |], slice.Data)
553+
554+ [<Fact>]
555+ let ``GetSlice Range - corner submatrices`` () =
556+ let mat = matrix [|
557+ [| 1.0 ; 2.0 ; 3.0 ; 4.0 |]
558+ [| 5.0 ; 6.0 ; 7.0 ; 8.0 |]
559+ [| 9.0 ; 10.0 ; 11.0 ; 12.0 |]
560+ [| 13.0 ; 14.0 ; 15.0 ; 16.0 |]
561+ |]
562+ // Top-left 2x2: mat.[..1, ..1]
563+ let topLeft = mat.[.. 1 , .. 1 ]
564+ Assert.Equal< Vector< float>>([| 1.0 ; 2.0 ; 5.0 ; 6.0 |], topLeft.Data)
565+
566+ // Top-right 2x2: mat.[..1, 2..]
567+ let topRight = mat.[.. 1 , 2 ..]
568+ Assert.Equal< Vector< float>>([| 3.0 ; 4.0 ; 7.0 ; 8.0 |], topRight.Data)
569+
570+ // Bottom-left 2x2: mat.[2.., ..1]
571+ let bottomLeft = mat.[ 2 .., .. 1 ]
572+ Assert.Equal< Vector< float>>([| 9.0 ; 10.0 ; 13.0 ; 14.0 |], bottomLeft.Data)
573+
574+ // Bottom-right 2x2: mat.[2.., 2..]
575+ let bottomRight = mat.[ 2 .., 2 ..]
576+ Assert.Equal< Vector< float>>([| 11.0 ; 12.0 ; 15.0 ; 16.0 |], bottomRight.Data)
0 commit comments