@@ -123,7 +123,7 @@ function LinearAlgebra.mul!(y::AbstractVecOrMat{T}, B::BlockDiagonal{T,V}, x::Ab
123
123
@floop @inbounds for (block_id, block) in enumerate (blocks (B))
124
124
block_start = B. cumulative_indices[block_id] + 1
125
125
block_end = B. cumulative_indices[block_id + 1 ]
126
- mul! (selectdim (y, 1 , block_start: block_end), block, selectdim (x, 1 , block_start: block_end) )
126
+ @views mul! (y[ block_start: block_end,:], block, x[ block_start: block_end,:] )
127
127
end
128
128
return y
129
129
end
@@ -133,7 +133,9 @@ function LinearAlgebra.:\(B::BlockDiagonal, x::AbstractVecOrMat)
133
133
@floop @inbounds for (block_id,block) in enumerate (blocks (B))
134
134
block_start = B. cumulative_indices[block_id] + 1
135
135
block_end = B. cumulative_indices[block_id + 1 ]
136
- y[block_start: block_end,:] = block\ selectdim (x,1 ,block_start: block_end)
136
+ # F = cholesky(block)
137
+ F = factorize (block)
138
+ @views ldiv! (y[block_start: block_end,:], F, x[block_start: block_end,:])
137
139
end
138
140
return y
139
141
end
@@ -153,10 +155,20 @@ function LinearAlgebra.eigen(B::BlockDiagonal)
153
155
@floop @inbounds for (block_id, block) in enumerate (blocks (B))
154
156
E = eigen (block)
155
157
vectors[block_id] .= E. vectors
156
- # push!(vectors,E.vectors)
157
158
block_start = B. cumulative_indices[block_id] + 1
158
159
block_end = B. cumulative_indices[block_id + 1 ]
159
160
values[block_start: block_end] = E. values
160
161
end
161
162
return Eigen (values,BlockDiagonal (vectors))
162
163
end
164
+
165
+
166
+ # # Functions
167
+ # Idea to include matrix functions?
168
+ for func in (:log , :sqrt , :sin , :tan , :cos , :sinh , :tanh )
169
+ @eval begin
170
+ function (Base.$ func)(B:: BlockDiagonal )
171
+ return BlockDiagonal ([($ func)(block) for block in blocks (B)])
172
+ end
173
+ end
174
+ end
0 commit comments