@@ -189,6 +189,57 @@ where
189
189
}
190
190
}
191
191
192
+ impl < A > SolveTriDiagonal < A , Ix2 > for TriDiagonal < A >
193
+ where
194
+ A : Scalar + Lapack ,
195
+ {
196
+ fn solve_tridiagonal < Sb : Data < Elem = A > > (
197
+ & self ,
198
+ b : & ArrayBase < Sb , Ix2 > ,
199
+ ) -> Result < Array < A , Ix2 > > {
200
+ let mut b = replicate ( b) ;
201
+ self . solve_tridiagonal_inplace ( & mut b) ?;
202
+ Ok ( b)
203
+ }
204
+ fn solve_tridiagonal_into < Sb : DataMut < Elem = A > > (
205
+ & self ,
206
+ mut b : ArrayBase < Sb , Ix2 > ,
207
+ ) -> Result < ArrayBase < Sb , Ix2 > > {
208
+ self . solve_tridiagonal_inplace ( & mut b) ?;
209
+ Ok ( b)
210
+ }
211
+ fn solve_t_tridiagonal < Sb : Data < Elem = A > > (
212
+ & self ,
213
+ b : & ArrayBase < Sb , Ix2 > ,
214
+ ) -> Result < Array < A , Ix2 > > {
215
+ let mut b = replicate ( b) ;
216
+ self . solve_t_tridiagonal_inplace ( & mut b) ?;
217
+ Ok ( b)
218
+ }
219
+ fn solve_t_tridiagonal_into < Sb : DataMut < Elem = A > > (
220
+ & self ,
221
+ mut b : ArrayBase < Sb , Ix2 > ,
222
+ ) -> Result < ArrayBase < Sb , Ix2 > > {
223
+ self . solve_t_tridiagonal_inplace ( & mut b) ?;
224
+ Ok ( b)
225
+ }
226
+ fn solve_h_tridiagonal < Sb : Data < Elem = A > > (
227
+ & self ,
228
+ b : & ArrayBase < Sb , Ix2 > ,
229
+ ) -> Result < Array < A , Ix2 > > {
230
+ let mut b = replicate ( b) ;
231
+ self . solve_h_tridiagonal_inplace ( & mut b) ?;
232
+ Ok ( b)
233
+ }
234
+ fn solve_h_tridiagonal_into < Sb : DataMut < Elem = A > > (
235
+ & self ,
236
+ mut b : ArrayBase < Sb , Ix2 > ,
237
+ ) -> Result < ArrayBase < Sb , Ix2 > > {
238
+ self . solve_h_tridiagonal_inplace ( & mut b) ?;
239
+ Ok ( b)
240
+ }
241
+ }
242
+
192
243
impl < A , S > SolveTriDiagonal < A , Ix2 > for ArrayBase < S , Ix2 >
193
244
where
194
245
A : Scalar + Lapack ,
@@ -298,6 +349,42 @@ where
298
349
}
299
350
}
300
351
352
+ impl < A > SolveTriDiagonalInplace < A , Ix2 > for TriDiagonal < A >
353
+ where
354
+ A : Scalar + Lapack ,
355
+ {
356
+ fn solve_tridiagonal_inplace < ' a , Sb > (
357
+ & self ,
358
+ rhs : & ' a mut ArrayBase < Sb , Ix2 > ,
359
+ ) -> Result < & ' a mut ArrayBase < Sb , Ix2 > >
360
+ where
361
+ Sb : DataMut < Elem = A > ,
362
+ {
363
+ let f = self . factorize_tridiagonal ( ) ?;
364
+ f. solve_tridiagonal_inplace ( rhs)
365
+ }
366
+ fn solve_t_tridiagonal_inplace < ' a , Sb > (
367
+ & self ,
368
+ rhs : & ' a mut ArrayBase < Sb , Ix2 > ,
369
+ ) -> Result < & ' a mut ArrayBase < Sb , Ix2 > >
370
+ where
371
+ Sb : DataMut < Elem = A > ,
372
+ {
373
+ let f = self . factorize_tridiagonal ( ) ?;
374
+ f. solve_t_tridiagonal_inplace ( rhs)
375
+ }
376
+ fn solve_h_tridiagonal_inplace < ' a , Sb > (
377
+ & self ,
378
+ rhs : & ' a mut ArrayBase < Sb , Ix2 > ,
379
+ ) -> Result < & ' a mut ArrayBase < Sb , Ix2 > >
380
+ where
381
+ Sb : DataMut < Elem = A > ,
382
+ {
383
+ let f = self . factorize_tridiagonal ( ) ?;
384
+ f. solve_h_tridiagonal_inplace ( rhs)
385
+ }
386
+ }
387
+
301
388
impl < A , S > SolveTriDiagonalInplace < A , Ix2 > for ArrayBase < S , Ix2 >
302
389
where
303
390
A : Scalar + Lapack ,
@@ -383,6 +470,60 @@ where
383
470
}
384
471
}
385
472
473
+ impl < A > SolveTriDiagonal < A , Ix1 > for TriDiagonal < A >
474
+ where
475
+ A : Scalar + Lapack ,
476
+ {
477
+ fn solve_tridiagonal < Sb : Data < Elem = A > > (
478
+ & self ,
479
+ b : & ArrayBase < Sb , Ix1 > ,
480
+ ) -> Result < Array < A , Ix1 > > {
481
+ let b = b. to_owned ( ) ;
482
+ self . solve_tridiagonal_into ( b)
483
+ }
484
+ fn solve_tridiagonal_into < Sb : DataMut < Elem = A > > (
485
+ & self ,
486
+ b : ArrayBase < Sb , Ix1 > ,
487
+ ) -> Result < ArrayBase < Sb , Ix1 > > {
488
+ let b = into_col ( b) ;
489
+ let f = self . factorize_tridiagonal ( ) ?;
490
+ let b = f. solve_tridiagonal_into ( b) ?;
491
+ Ok ( flatten ( b) )
492
+ }
493
+ fn solve_t_tridiagonal < Sb : Data < Elem = A > > (
494
+ & self ,
495
+ b : & ArrayBase < Sb , Ix1 > ,
496
+ ) -> Result < Array < A , Ix1 > > {
497
+ let b = b. to_owned ( ) ;
498
+ self . solve_t_tridiagonal_into ( b)
499
+ }
500
+ fn solve_t_tridiagonal_into < Sb : DataMut < Elem = A > > (
501
+ & self ,
502
+ b : ArrayBase < Sb , Ix1 > ,
503
+ ) -> Result < ArrayBase < Sb , Ix1 > > {
504
+ let b = into_col ( b) ;
505
+ let f = self . factorize_tridiagonal ( ) ?;
506
+ let b = f. solve_t_tridiagonal_into ( b) ?;
507
+ Ok ( flatten ( b) )
508
+ }
509
+ fn solve_h_tridiagonal < Sb : Data < Elem = A > > (
510
+ & self ,
511
+ b : & ArrayBase < Sb , Ix1 > ,
512
+ ) -> Result < Array < A , Ix1 > > {
513
+ let b = b. to_owned ( ) ;
514
+ self . solve_h_tridiagonal_into ( b)
515
+ }
516
+ fn solve_h_tridiagonal_into < Sb : DataMut < Elem = A > > (
517
+ & self ,
518
+ b : ArrayBase < Sb , Ix1 > ,
519
+ ) -> Result < ArrayBase < Sb , Ix1 > > {
520
+ let b = into_col ( b) ;
521
+ let f = self . factorize_tridiagonal ( ) ?;
522
+ let b = f. solve_h_tridiagonal_into ( b) ?;
523
+ Ok ( flatten ( b) )
524
+ }
525
+ }
526
+
386
527
impl < A , S > SolveTriDiagonal < A , Ix1 > for ArrayBase < S , Ix2 >
387
528
where
388
529
A : Scalar + Lapack ,
0 commit comments