From 6b32f8e506c511ae858fec716a3370f2d7bb4a74 Mon Sep 17 00:00:00 2001 From: Sam Avis Date: Mon, 6 Jul 2026 15:38:35 +0100 Subject: [PATCH] Make BandMatrixRow callable --- src/MatrixFields/band_matrix_row.jl | 8 ++++++++ test/MatrixFields/band_matrix_row.jl | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/src/MatrixFields/band_matrix_row.jl b/src/MatrixFields/band_matrix_row.jl index 0b795fc091..c2dbe26fce 100644 --- a/src/MatrixFields/band_matrix_row.jl +++ b/src/MatrixFields/band_matrix_row.jl @@ -157,3 +157,11 @@ inv(::BandMatrixRow{ld, bw}) where {ld, bw} = error( "The inverse of a matrix with $bw diagonals is generally a dense matrix, \ so it cannot be represented using BandMatrixRows", ) + +@generated function (row::BandMatrixRow{ld, bw, T})(args::Vararg{Any, N}) where {ld, bw, T, N} + N == bw || error( + "BandMatrixRow with bandwidth $bw expected $bw arguments, but got $N" + ) + terms = [:(row.entries[$i] * args[$i]) for i in 1:bw] + return Expr(:call, :+, terms...) +end diff --git a/test/MatrixFields/band_matrix_row.jl b/test/MatrixFields/band_matrix_row.jl index ac5a55bd1c..a72d9764a2 100644 --- a/test/MatrixFields/band_matrix_row.jl +++ b/test/MatrixFields/band_matrix_row.jl @@ -58,4 +58,11 @@ include("matrix_field_test_utils.jl") @test zero(typeof(DiagonalMatrixRow(1))) == DiagonalMatrixRow(0) @test eltype(typeof(DiagonalMatrixRow(1))) == Int @test inv(DiagonalMatrixRow(1)) == DiagonalMatrixRow(float(1)) + + # Test callable behaviour + @test DiagonalMatrixRow(2.0)(10.0) == 20.0 + @test BidiagonalMatrixRow(1.0, 2.0)(10.0, 5.0) == 20.0 + @test TridiagonalMatrixRow(-1.0, 2.0, -1.0)(10.0, 25.0, 12.0) == 28.0 + @test_throws ErrorException TridiagonalMatrixRow(1, 2, 3)(10.0, 5.0) + @test_throws ErrorException TridiagonalMatrixRow(1, 2, 3)(10.0, 5.0, 1.0, 2.0) end