diff --git a/Project.toml b/Project.toml index 06b8da2..6dd6f31 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ArrayLayouts" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" authors = ["Sheehan Olver "] -version = "0.4.4" +version = "0.4.5" [deps] FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" diff --git a/src/mul.jl b/src/mul.jl index deaaec3..999dcff 100644 --- a/src/mul.jl +++ b/src/mul.jl @@ -252,3 +252,4 @@ dot(a, b) = materialize(Dot(a, b)) # We go to generic fallback as layout-arrays are structured dot(x, A, y) = dot(x, mul(A, y)) LinearAlgebra.dot(x::AbstractVector, A::LayoutMatrix, y::AbstractVector) = dot(x, A, y) +LinearAlgebra.dot(x::AbstractVector, A::Symmetric{<:Real,<:LayoutMatrix}, y::AbstractVector) = dot(x, A, y) diff --git a/src/triangular.jl b/src/triangular.jl index 7228da1..f101be5 100644 --- a/src/triangular.jl +++ b/src/triangular.jl @@ -29,10 +29,11 @@ function materialize!(M::Lmul{<:TriangularLayout{'U','N'}}) throw(DimensionMismatch("right hand side B needs first dimension of size $(size(A,1)), has size $m")) end Adata = triangulardata(A) - for j = 1:n - for i = 1:m + for j = rowsupport(B) + cs = colsupport(B,j) + for i = cs Bij = Adata[i,i]*B[i,j] - for k = (i + 1:m) ∩ rowsupport(Adata,i) + for k = (i + 1:m) ∩ cs ∩ rowsupport(Adata,i) Bij += Adata[i,k]*B[k,j] end B[i,j] = Bij @@ -48,10 +49,11 @@ function materialize!(M::Lmul{<:TriangularLayout{'U','U'}}) throw(DimensionMismatch("right hand side B needs first dimension of size $(size(A,1)), has size $m")) end Adata = triangulardata(A) - for j = 1:n - for i = 1:m + for j = rowsupport(B) + cs = colsupport(B,j) + for i = cs Bij = B[i,j] - for k = (i + 1:m) ∩ rowsupport(Adata,i) + for k = (i + 1:m) ∩ cs ∩ rowsupport(Adata,i) Bij += Adata[i,k]*B[k,j] end B[i,j] = Bij