Object
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;
}
Generated with the Darkfish Rdoc Generator 2.