229 U(MatrixNi::Identity()),
230 V(MatrixNi::Identity()),
231 X(MatrixNi::Identity()),
232 Y(MatrixNi::Identity())
238 std::pair<int,int> rc=std::make_pair(0,0);
241 std::pair<int,int> ij=findNonZero(D);
245 row_swap(0,ij.first);
246 col_swap(0,ij.second);
249 bool didOperate=
true;
252 didOperate=reduceFirstRow()+reduceFirstCol();
263 for (
int i=1;
i<
N;++
i)
265 const IntValueType
q=
D(
i,0)/
D(0,0);
266 row_add_multiply(
i,0,-
q);
271 for (
int j=1;
j<
N;++
j)
273 const IntValueType
q=
D(0,
j)/
D(0,0);
274 col_add_multiply(
j,0,-
q);
278 rc=findNonDivisible(D);
281 row_add_multiply(0,rc.first,1);
290 rc=std::make_pair(-1,-1);
298 D.template block<
N-1,
N-1>(1,1)=sd.matrixD();
299 U.template block<
N-1,
N>(1,0)=sd.matrixU()*U.template block<
N-1,
N>(1,0);
300 V.template block<1,
N-1>(0,1)=V.template block<1,N-1>(0,1)*sd.matrixV();
301 V.template block<
N-1,
N-1>(1,1)=V.template block<N-1,N-1>(1,1)*sd.matrixV();
303 Y.template block<
N-1,
N>(1,0)=sd.matrixY()*Y.template block<
N-1,
N>(1,0);
304 X.template block<1,
N-1>(0,1)=X.template block<1,N-1>(0,1)*sd.matrixX();
305 X.template block<
N-1,
N-1>(1,1)=X.template block<N-1,N-1>(1,1)*sd.matrixX();
311 assert((U*
A*V-D).squaredNorm()==0);
312 assert((X*D*Y-
A).squaredNorm()==0);