class NMatrixLU
Public Instance Methods
solve(arg) → result
click to toggle source
Solve with the result of LU factorization. arg should be NMatrix
or NVector
instance. Returns an instance of same class with arg.
static VALUE na_lu_solve(VALUE self, volatile VALUE other) { int n, ndim; int *shape; struct NARRAY *a1, *a2, *l, *p; VALUE pv, obj, klass; volatile VALUE lu; klass = CLASS_OF(other); if (klass==cNVector) other = na_newdim_ref(1,(VALUE*)na_funcset[NA_ROBJ].zero,other); else if (klass!=cNMatrix) rb_raise(rb_eTypeError,"neither NMatrix or NVector"); lu = rb_ivar_get(self, id_lu); pv = rb_ivar_get(self, id_pivot); GetNArray(lu,l); other = na_upcast_object(other,l->type); GetNArray(other,a1); lu = na_upcast_type(lu,a1->type); GetNArray(lu,l); GetNArray(pv,p); n = l->shape[0]; if (n != a1->shape[1]) rb_raise(rb_eTypeError,"size mismatch (%i!=%i)",n,a1->shape[1]); ndim = NA_MAX(l->rank, a1->rank); shape = ALLOCA_N(int, ndim); shape[0] = a1->shape[0]; na_shape_max2( ndim-1, shape+1, a1->rank-1, a1->shape+1, l->rank-1, l->shape+1 ); obj = na_make_object( a1->type, ndim, shape, klass ); GetNArray(obj,a2); na_exec_linalg( a2, a1, p, 2, 2, 1, na_lu_pivot_func ); na_exec_linalg( a2, a2, l, 2, 2, 2, na_lu_solve_func ); if (klass==cNVector) { shape = ALLOC_N(int, ndim-1); memcpy(shape,a2->shape+1,sizeof(int)*(ndim-1)); xfree(a2->shape); a2->shape = shape; --(a2->rank); } return obj; }