factrix := proc(M) local Mt, t, v, f, i, j, m, n, q, S, Si, res, u; options `Maple Advisor Database 1.01 for Maple 6`, `Copyright (c) 2000 by Robert B. Israel. All rights reserved`; Mt := M; if not type(Mt,{Matrix,Vector}) then Mt := evalm(Mt) fi; if hastype(eval(Mt),float) then S:=map(t -> (t=`tools/gensym`(f)), indets([flatten(Mt)],float)); Mt:= map2(subs,S,Mt); Si:= map(e -> (rhs(e)=lhs(e)), S); else Si:= {}; fi; if type(Mt, matrix) then m := linalg[rowdim](Mt); n := linalg[coldim](Mt); v := factor(q*add(add(f[i, j]*Mt[i, j], i = 1 .. m), j = 1 .. n)); t,u := selectremove(hastype, v, f[anything, anything]); Mt := subs(q=1,[seq([seq(coeff(t, f[i, j]), j = 1 .. n)], i = 1 .. m)]); if hastype(M, matrix) then Mt := matrix(Mt) fi elif type(Mt, vector) then m := linalg[vectdim](Mt); v := factor(q*add(f[i]*Mt[i], i = 1 .. m)); t,u := selectremove(hastype, v, f[anything]); Mt := subs(q=1,[seq(coeff(t, f[i]), i = 1 .. m)]); if hastype(M, vector) then Mt := vector(Mt) fi elif type(Mt, Matrix) then m:= LinearAlgebra:-RowDimension(Mt); n:= LinearAlgebra:-ColumnDimension(Mt); v := factor(q*add(add(f[i, j]*Mt[i, j], i = 1 .. m), j = 1 .. n)); t,u := selectremove(hastype, v, f[anything, anything]); Mt := Matrix(m,n,(i,j) -> subs(q=1,coeff(t, f[i, j]))); elif type(Mt,Vector) then m:= LinearAlgebra:-Dimension(Mt); n:= VectorOptions(Mt,orientation); v := factor(q*add(f[i]*Mt[i], i = 1 .. m)); t,u := selectremove(hastype, v, f[anything]); Mt := Vector(m,i -> subs(q=1,coeff(t, f[i])),orientation=n); else ERROR(M, `does not evaluate to a matrix, vector, Matrix or Vector`) fi; if type(Mt,{Matrix,Vector}) then subs(res=u,q=1,Si,res.Mt) else subs(res=u,q=1,Si,res*eval(Mt)) fi; end;