2 * PROJECT: NyARToolkit
\r
3 * --------------------------------------------------------------------------------
\r
4 * This work is based on the original ARToolKit developed by
\r
7 * HITLab, University of Washington, Seattle
\r
8 * http://www.hitl.washington.edu/artoolkit/
\r
10 * The NyARToolkit is Java version ARToolkit class library.
\r
11 * Copyright (C)2008 R.Iizuka
\r
13 * This program is free software; you can redistribute it and/or
\r
14 * modify it under the terms of the GNU General Public License
\r
15 * as published by the Free Software Foundation; either version 2
\r
16 * of the License, or (at your option) any later version.
\r
18 * This program is distributed in the hope that it will be useful,
\r
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
21 * GNU General Public License for more details.
\r
23 * You should have received a copy of the GNU General Public License
\r
24 * along with this framework; if not, write to the Free Software
\r
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
27 * For further information please contact.
\r
28 * http://nyatla.jp/nyatoolkit/
\r
29 * <airmail(at)ebony.plala.or.jp>
\r
32 package jp.nyatla.nyartoolkit.core;
\r
34 import jp.nyatla.nyartoolkit.NyARException;
\r
47 public class NyARMat{
\r
48 private double[][] m;
\r
49 private int clm,row;
\r
50 public NyARMat(int i_row,int i_clm)
\r
52 m=new double[i_row][i_clm];
\r
67 public void zeroClear()
\r
69 for(int i=0;i<row;i++){
\r
70 for(int i2=0;i2<clm;i2++){
\r
75 public double[] getRowArray(int i_row)
\r
79 public double[][] getArray()
\r
83 public NyARVec getRowVec(int i_row)
\r
85 return NyARVec.wrap(m[i_row]);
\r
88 * aとbの積をdestに出力する。arMatrixMul()の代替品
\r
92 * @throws NyARException
\r
94 public static void matrixMul(NyARMat dest, NyARMat a, NyARMat b) throws NyARException
\r
96 if(a.clm != b.row || dest.row != a.row || dest.clm != b.clm){
\r
97 throw new NyARException();
\r
99 for(int r = 0; r < dest.row; r++){
\r
100 for(int c = 0; c < dest.getClm(); c++){
\r
101 dest.m[r][c]=0.0;//dest.setARELEM0(r, c,0.0);
\r
102 for(int i = 0; i < a.getClm(); i++){
\r
103 dest.m[r][c]+=a.m[r][i]*b.m[i][c];//ARELEM0(dest, r, c) += ARELEM0(a, r, i) * ARELEM0(b, i, c);
\r
109 * i_targetを逆行列に変換する。arMatrixSelfInv()と、arMatrixSelfInv_minv()関数を合成してあります。
\r
112 * @throws NyARException
\r
114 public static void matrixSelfInv(NyARMat i_target) throws NyARException
\r
116 double[][] ap=i_target.m;
\r
117 int dimen=ap.length;
\r
118 double[] wcp,wap,wbp;
\r
120 int[] nos=new int[50];
\r
122 double p,pbuf,work;
\r
124 epsl = 1.0e-10; /* Threshold value */
\r
128 throw new NyARException();
\r
130 ap[0][0]=1.0/ap[0][0];//*ap = 1.0 / (*ap);
\r
131 return;/* 1 dimension */
\r
134 for(int n = 0; n < dimen ; n++){
\r
139 * ipが定まらないで計算が行われる場合があるので挿入。
\r
140 * ループ内で0初期化していいかが判らない。
\r
143 int wap_ptr,wbp_ptr;
\r
144 for(int n=0; n<dimen;n++)
\r
146 wcp =ap[n];//wcp = ap + n * rowa;
\r
148 wap_ptr=0;//wap = DoublePointer.wrap(wcp);
\r
149 for(i = n; i<dimen ; i++){//for(i = n, wap = wcp, p = 0.0; i < dimen ; i++, wap += rowa)
\r
151 if( p < ( pbuf = Math.abs(wap[0]))) {
\r
168 for(j=0; j< dimen ; j++){//for(j = 0, wap = ap + ip * rowa, wbp = wcp; j < dimen ; j++) {
\r
169 work = wap[wap_ptr]; //work = *wap;
\r
170 wap[wap_ptr]=wbp[wbp_ptr];wap_ptr++;//*wap++ = *wbp;
\r
171 wbp[wbp_ptr]=work;wbp_ptr++; //*wbp++ = work;
\r
177 for(j = 1; j < dimen ; j++){//for(j = 1, wap = wcp, work = *wcp; j < dimen ; j++, wap++)
\r
178 wap[wap_ptr]=wap[wap_ptr+1]/work;//*wap = *(wap + 1) / work;
\r
181 wap[wap_ptr]=1.0/work;//*wap = 1.0 / work;
\r
183 for(i = 0; i < dimen ; i++) {
\r
185 wap =ap[i];//wap = ap + i * rowa;
\r
190 for(j = 1;j < dimen ; j++){//for(j = 1, wbp = wcp, work = *wap;j < dimen ; j++, wap++, wbp++)
\r
191 wap[wap_ptr]=wap[wap_ptr+1]-work*wbp[wbp_ptr];//wap = *(wap + 1) - work * (*wbp);
\r
195 wap[wap_ptr]=-work*wbp[wbp_ptr];//*wap = -work * (*wbp);
\r
200 for(int n = 0; n < dimen ; n++) {
\r
201 for(j = n; j < dimen ; j++){
\r
207 for(i = 0; i < dimen ;i++){//for(i = 0, wap = ap + j, wbp = ap + n; i < dimen ;i++, wap += rowa, wbp += rowa) {
\r
210 work =wap[j];//work = *wap;
\r
211 wap[j]=wbp[n];//*wap = *wbp;
\r
212 wbp[n]=work;//*wbp = work;
\r
218 * sourceの転置行列をdestに得る。arMatrixTrans()の代替品
\r
223 public static void matrixTrans(NyARMat dest,NyARMat source) throws NyARException
\r
225 if(dest.row != source.clm || dest.clm != source.row){
\r
226 throw new NyARException();
\r
228 NyARException.trap("未チェックのパス");
\r
229 for(int r=0;r< dest.row;r++){
\r
230 for(int c=0;c<dest.clm;c++){
\r
231 dest.m[r][c]=source.m[c][r];
\r
236 * unitを単位行列に初期化する。arMatrixUnitの代替品
\r
239 public static void matrixUnit(NyARMat unit) throws NyARException
\r
241 if(unit.row != unit.clm){
\r
242 throw new NyARException();
\r
244 NyARException.trap("未チェックのパス");
\r
245 for(int r = 0; r < unit.getRow(); r++) {
\r
246 for(int c = 0; c < unit.getClm(); c++) {
\r
256 * destにsourceと同じ内容をコピーする。arMatrixDupの代替品
\r
261 public static void matrixDup(NyARMat dest, NyARMat source) throws NyARException
\r
263 if(dest.row != source.row || dest.clm != source.clm)
\r
265 throw new NyARException();
\r
267 for(int r = 0; r < source.getRow(); r++) {
\r
268 for(int c = 0; c < source.getClm(); c++)
\r
270 dest.m[r][c]=source.m[r][c];
\r
274 public NyARMat matrixAllocDup() throws NyARException
\r
276 NyARMat result=new NyARMat(row,clm);
\r
277 matrixDup(result,this);
\r
281 * arMatrixInv関数の代替品です。
\r
282 * destにsourceの逆行列を返します。
\r
285 * @throws NyARException
\r
287 public static void matrixInv(NyARMat dest,NyARMat source) throws NyARException
\r
289 NyARException.trap("未チェックのパス");
\r
290 matrixDup(dest, source);
\r
292 NyARException.trap("未チェックのパス");
\r
293 matrixSelfInv(dest);
\r
295 public NyARMat matrixAllocInv() throws NyARException
\r
297 NyARException.trap("未チェックのパス");
\r
298 NyARMat result=matrixAllocDup();
\r
300 NyARException.trap("未チェックのパス");
\r
301 matrixSelfInv(result);
\r
305 * dim x dim の単位行列を作る。
\r
308 * @throws NyARException
\r
310 public static NyARMat matrixAllocUnit(int dim) throws NyARException
\r
312 NyARException.trap("未チェックのパス");
\r
313 NyARMat result = new NyARMat(dim, dim);
\r
314 NyARException.trap("未チェックのパス");
\r
315 NyARMat.matrixUnit(result);
\r
323 public int matrixDisp() throws NyARException
\r
325 NyARException.trap("未チェックのパス");
\r
326 System.out.println(" === matrix ("+row+","+clm+") ===");//printf(" === matrix (%d,%d) ===\n", m->row, m->clm);
\r
327 for(int r = 0; r < row; r++){//for(int r = 0; r < m->row; r++) {
\r
328 System.out.print(" |");//printf(" |");
\r
329 for(int c = 0; c < clm; c++) {//for(int c = 0; c < m->clm; c++) {
\r
330 System.out.print(" "+m[r][c]);//printf(" %10g", ARELEM0(m, r, c));
\r
332 System.out.println(" |");//printf(" |\n");
\r
334 System.out.println(" ======================");//printf(" ======================\n");
\r
337 private final static double PCA_EPS=1e-6; //#define EPS 1e-6
\r
338 private final static int PCA_MAX_ITER=100; //#define MAX_ITER 100
\r
339 private final static double PCA_VZERO=1e-16; //#define VZERO 1e-16
\r
341 * static int EX( ARMat *input, ARVec *mean )の代替関数
\r
345 * @throws NyARException
\r
347 private static void PCA_EX(NyARMat input, NyARVec mean) throws NyARException
\r
355 if(row <= 0 || clm <= 0){
\r
356 throw new NyARException();
\r
358 if( mean.getClm() != clm ){
\r
359 throw new NyARException();
\r
361 double[] mean_array=mean.getArray();
\r
362 for(int i = 0; i < clm; i++ ){
\r
363 mean_array[i]=0.0;//mean->v[i] = 0.0;
\r
367 for(int i = 0; i < row; i++ ) {
\r
368 for(int j = 0; j < clm; j++ ){
\r
369 //*(v++) += *(m++);
\r
370 v[j]+=input.m[i][j];
\r
374 for(int i = 0; i < clm; i++ ){
\r
375 mean_array[i]/=row;//mean->v[i] /= row;
\r
379 * static int CENTER( ARMat *inout, ARVec *mean )の代替関数
\r
384 private static void PCA_CENTER(NyARMat inout, NyARVec mean) throws NyARException
\r
389 row = inout.getRow();
\r
390 clm = inout.getClm();
\r
391 if(mean.getClm()!= clm){
\r
392 throw new NyARException();
\r
395 v = mean.getArray();
\r
396 for(int i = 0; i < row; i++ ) {
\r
397 for(int j = 0; j < clm; j++ ){
\r
398 //*(m++) -= *(v++);
\r
399 inout.m[i][j]-=v[j];
\r
404 * int x_by_xt( ARMat *input, ARMat *output )の代替関数
\r
407 * @throws NyARException
\r
409 private static void PCA_x_by_xt( NyARMat input, NyARMat output) throws NyARException
\r
411 NyARException.trap("動作未チェック/配列化未チェック");
\r
416 NyARException.trap("未チェックのパス");
\r
419 NyARException.trap("未チェックのパス");
\r
420 if( output.row != row || output.clm != row ){
\r
421 throw new NyARException();
\r
424 // out = output.getArray();
\r
425 for(int i = 0; i < row; i++ ) {
\r
426 for(int j = 0; j < row; j++ ) {
\r
428 NyARException.trap("未チェックのパス");{
\r
429 output.m[i][j]=output.m[j][i];//*out = output->m[j*row+i];
\r
432 in1=input.getRowArray(i);//in1 = &(input->m[clm*i]);
\r
433 in2=input.getRowArray(j);//in2 = &(input->m[clm*j]);
\r
434 output.m[i][j]=0;//*out = 0.0;
\r
435 for(int k = 0; k < clm; k++ ){
\r
436 output.m[i][j]+=(in1[k]*in2[k]);//*out += *(in1++) * *(in2++);
\r
444 * static int xt_by_x( ARMat *input, ARMat *output )の代替関数
\r
447 * @throws NyARException
\r
449 private static void PCA_xt_by_x(NyARMat input, NyARMat output) throws NyARException
\r
456 if(output.row!= clm || output.clm != clm ){
\r
457 throw new NyARException();
\r
460 for(int i = 0; i < clm; i++ ) {
\r
461 for(int j = 0; j < clm; j++ ) {
\r
463 output.m[i][j]=output.m[j][i];//*out = output->m[j*clm+i];
\r
465 output.m[i][j]=0.0;//*out = 0.0;
\r
466 for(int k = 0; k < row; k++ ){
\r
467 in=input.getRowArray(k);
\r
468 output.m[i][j]+=(in[i]*in[j]);//*out += *in1 * *in2;
\r
475 * static int QRM( ARMat *a, ARVec *dv )の代替関数
\r
478 * @throws NyARException
\r
480 private static void PCA_QRM(NyARMat a, NyARVec dv) throws NyARException
\r
482 double w, t, s, x, y, c;
\r
484 double[] dv_array=dv.getArray();
\r
487 if( dim != a.clm || dim < 2 ){
\r
488 throw new NyARException();
\r
490 if( dv.getClm() != dim ){
\r
491 throw new NyARException();
\r
494 NyARVec ev = new NyARVec( dim );
\r
495 double[] ev_array=ev.getArray();
\r
497 throw new NyARException();
\r
500 NyARVec.vecTridiagonalize(a,dv,ev,1);
\r
502 ev_array[0]=0.0;//ev->v[0] = 0.0;
\r
503 for(int h = dim-1; h > 0; h-- ) {
\r
505 while(j>0 && Math.abs(ev_array[j]) > PCA_EPS*(Math.abs(dv_array[j-1])+Math.abs(dv_array[j]))){// while(j>0 && fabs(ev->v[j]) > EPS*(fabs(dv->v[j-1])+fabs(dv->v[j]))) j--;
\r
514 if( iter > PCA_MAX_ITER ){
\r
517 w = (dv_array[h-1] - dv_array[h]) / 2;//w = (dv->v[h-1] - dv->v[h]) / 2;//ここ?
\r
518 t = ev_array[h] * ev_array[h];//t = ev->v[h] * ev->v[h];
\r
519 s = Math.sqrt(w*w+t);
\r
523 x=dv_array[j] - dv_array[h] + t/(w+s);//x = dv->v[j] - dv->v[h] + t/(w+s);
\r
524 y=ev_array[j+1];//y = ev->v[j+1];
\r
525 for(int k = j; k < h; k++ ){
\r
526 if( Math.abs(x) >= Math.abs(y)){
\r
527 if( Math.abs(x) > PCA_VZERO ) {
\r
529 c = 1 / Math.sqrt(t*t+1);
\r
537 s = 1.0 / Math.sqrt(t*t+1);
\r
540 w = dv_array[k] - dv_array[k+1];//w = dv->v[k] - dv->v[k+1];
\r
541 t = (w * s + 2 * c * ev_array[k+1]) * s;//t = (w * s + 2 * c * ev->v[k+1]) * s;
\r
542 dv_array[k]-=t;//dv->v[k] -= t;
\r
543 dv_array[k+1]+=t;//dv->v[k+1] += t;
\r
545 NyARException.trap("未チェックパス");{
\r
546 ev_array[k]=c * ev_array[k] - s * y;//ev->v[k] = c * ev->v[k] - s * y;
\r
549 ev_array[k+1]+=s * (c * w - 2 * s * ev_array[k+1]);//ev->v[k+1] += s * (c * w - 2 * s * ev->v[k+1]);
\r
551 for(int i = 0; i < dim; i++ ){
\r
552 x = a.m[k][i];//x = a->m[k*dim+i];
\r
553 y = a.m[k+1][i];//y = a->m[(k+1)*dim+i];
\r
554 a.m[k][i]=c * x - s * y;//a->m[k*dim+i] = c * x - s * y;
\r
555 a.m[k+1][i]=s * x + c * y;//a->m[(k+1)*dim+i] = s * x + c * y;
\r
558 NyARException.trap("未チェックパス");{
\r
559 x = ev_array[k+1];//x = ev->v[k+1];
\r
560 y =-s*ev_array[k+2];//y = -s * ev->v[k+2];
\r
561 ev_array[k+2]*=c;//ev->v[k+2] *= c;
\r
565 }while(Math.abs(ev_array[h]) > PCA_EPS*(Math.abs(dv_array[h-1])+Math.abs(dv_array[h])));
\r
568 for(int k = 0; k < dim-1; k++ ) {
\r
570 t=dv_array[h];//t = dv->v[h];
\r
571 for(int i = k+1; i < dim; i++ ){
\r
572 if(dv_array[i] > t ){//if( dv->v[i] > t ) {
\r
574 t=dv_array[h];//t = dv->v[h];
\r
577 dv_array[h]=dv_array[k];//dv->v[h] = dv->v[k];
\r
578 dv_array[k]=t;//dv->v[k] = t;
\r
579 v1=a.getRowArray(h);//v1 = &(a->m[h*dim]);
\r
580 v2=a.getRowArray(k);//v2 = &(a->m[k*dim]);
\r
581 for(int i = 0; i < dim; i++ ) {
\r
583 v1[i]=v2[i];//*v1 = *v2;
\r
589 * static int EV_create( ARMat *input, ARMat *u, ARMat *output, ARVec *ev )の代替関数
\r
594 * @throws NyARException
\r
596 private static void PCA_EV_create(NyARMat input, NyARMat u, NyARMat output, NyARVec ev) throws NyARException
\r
598 NyARException.trap("未チェックのパス");
\r
600 row = input.row;//row = input->row;
\r
601 clm = input.clm;//clm = input->clm;
\r
602 if( row <= 0 || clm <= 0 ){
\r
603 throw new NyARException();
\r
605 if( u.row != row || u.clm != row ){//if( u->row != row || u->clm != row ){
\r
606 throw new NyARException();
\r
608 if( output.row != row || output.clm != clm ){//if( output->row != row || output->clm != clm ){
\r
609 throw new NyARException();
\r
611 if( ev.getClm()!= row ){//if( ev->clm != row ){
\r
612 throw new NyARException();
\r
615 double[] m1,ev_array;
\r
618 m =output.getArray();//m = output->m;
\r
619 in=input.getArray();
\r
621 ev_array=ev.getArray();
\r
622 for(i = 0; i < row; i++ ) {
\r
623 NyARException.trap("未チェックのパス");
\r
624 if( ev_array[i]<PCA_VZERO ){//if( ev->v[i] < VZERO ){
\r
627 NyARException.trap("未チェックのパス");
\r
628 work = 1 / Math.sqrt(Math.abs(ev_array[i]));//work = 1 / sqrt(fabs(ev->v[i]));
\r
629 for(int j = 0; j < clm; j++ ) {
\r
631 m1=u.getRowArray(i);//m1 = &(u->m[i*row]);
\r
632 // m2=input.getPointer(j);//m2 = &(input->m[j]);
\r
633 for(int k = 0; k < row; k++ ) {
\r
634 sum+=m1[k]+in[k][j];//sum += *m1 * *m2;
\r
635 // m1.incPtr(); //m1++;
\r
636 // m2.addPtr(clm);//m2 += clm;
\r
638 m1[j]=sum * work;//*(m++) = sum * work;
\r
639 // {//*(m++) = sum * work;
\r
640 // m.set(sum * work);
\r
644 for( ; i < row; i++ ) {
\r
645 NyARException.trap("未チェックのパス");
\r
646 ev_array[i]=0.0;//ev->v[i] = 0.0;
\r
647 for(int j = 0; j < clm; j++ ){
\r
649 // m.set(0.0);//*(m++) = 0.0;
\r
654 /*static int PCA( ARMat *input, ARMat *output, ARVec *ev )*/
\r
655 private static void PCA_PCA(NyARMat input, NyARMat output, NyARVec ev) throws NyARException
\r
659 double[] ev_array=ev.getArray();
\r
661 row =input.row;//row = input->row;
\r
662 clm =input.clm;//clm = input->clm;
\r
663 min =(clm < row)? clm: row;
\r
664 if( row < 2 || clm < 2 ){
\r
665 throw new NyARException();
\r
667 if( output.clm != input.clm){//if( output->clm != input->clm ){
\r
668 throw new NyARException();
\r
670 if( output.row!= min ){//if( output->row != min ){
\r
671 throw new NyARException();
\r
673 if( ev.getClm() != min ){//if( ev->clm != min ){
\r
674 throw new NyARException();
\r
676 u =new NyARMat( min, min );
\r
679 NyARException.trap("未チェックのパス");
\r
680 PCA_x_by_xt( input, u );//if(x_by_xt( input, u ) < 0 ) {
\r
682 PCA_xt_by_x( input, u );//if(xt_by_x( input, u ) < 0 ) {
\r
688 NyARException.trap("未チェックのパス");{
\r
689 PCA_EV_create( input, u, output, ev );
\r
692 m1=u.m;//m1 = u->m;
\r
693 m2=output.m;//m2 = output->m;
\r
695 for(i = 0; i < min; i++){
\r
696 if( ev_array[i] < PCA_VZERO){//if( ev->v[i] < VZERO ){
\r
699 for(int j = 0; j < min; j++ ){
\r
700 m2[i][j]=m1[i][j];//*(m2++) = *(m1++);
\r
703 for( ; i < min; i++){//for( ; i < min; i++){
\r
704 //コードを見た限りあってそうだからコメントアウト(2008/03/26)NyARException.trap("未チェックのパス");
\r
705 ev_array[i]=0.0;//ev->v[i] = 0.0;
\r
706 for(int j = 0; j < min; j++ ){
\r
707 m2[i][j]=0.0;//*(m2++) = 0.0;
\r
713 /*int arMatrixPCA( ARMat *input, ARMat *evec, ARVec *ev, ARVec *mean );*/
\r
714 public static void matrixPCA(NyARMat input, NyARMat evec, NyARVec ev, NyARVec mean) throws NyARException
\r
721 row=input.row;//row = input->row;
\r
722 clm=input.clm;//clm = input->clm;
\r
723 check = (row < clm)? row: clm;
\r
724 if( row < 2 || clm < 2 ){
\r
725 throw new NyARException();
\r
727 if( evec.clm != input.clm || evec.row != check ){//if( evec->clm != input->clm || evec->row != check ){
\r
728 throw new NyARException();
\r
730 if( ev.getClm() != check ){//if( ev->clm != check ){
\r
731 throw new NyARException();
\r
733 if( mean.getClm() != input.clm){//if( mean->clm != input->clm ){
\r
734 throw new NyARException();
\r
737 work =input.matrixAllocDup();//arMatrixAllocDup( input );work = arMatrixAllocDup( input );
\r
739 srow = Math.sqrt((double)row);
\r
740 PCA_EX( work, mean );
\r
742 PCA_CENTER(work,mean);
\r
745 for(int i=0; i<row; i++){
\r
746 for(int j=0;j<clm;j++){
\r
747 work.m[i][j]/=srow;//work->m[i] /= srow;
\r
751 PCA_PCA( work, evec, ev );
\r
754 double[] ev_array=ev.getArray();
\r
755 for(int i = 0; i < ev.getClm(); i++ ){//for(int i = 0; i < ev->clm; i++ ){
\r
756 sum+=ev_array[i];//sum += ev->v[i];
\r
758 for(int i = 0; i < ev.getClm(); i++ ){//for(int i = 0; i < ev->clm; i++ ){
\r
759 ev_array[i]/=sum;//ev->v[i] /= sum;
\r
763 /*int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev );*/
\r
764 public static void arMatrixPCA2( NyARMat input, NyARMat evec, NyARVec ev) throws NyARException
\r
766 NyARException.trap("未チェックのパス");
\r
768 // double srow; // unreferenced
\r
773 row=input.row;//row = input->row;
\r
774 clm=input.clm;//clm = input->clm;
\r
775 check = (row < clm)? row: clm;
\r
776 if( row < 2 || clm < 2 ){
\r
777 throw new NyARException();
\r
779 if( evec.getClm()!= input.clm|| evec.row!=check){//if( evec->clm != input->clm || evec->row != check ){
\r
780 throw new NyARException();
\r
782 if( ev.getClm() != check ){//if( ev->clm != check ){
\r
783 throw new NyARException();
\r
786 NyARException.trap("未チェックのパス");
\r
787 work =input.matrixAllocDup();
\r
789 NyARException.trap("未チェックパス");
\r
790 PCA_PCA( work, evec, ev );//rval = PCA( work, evec, ev );
\r
792 double[] ev_array=ev.getArray();
\r
793 for(int i = 0; i < ev.getClm(); i++ ){//for( i = 0; i < ev->clm; i++ ){
\r
794 NyARException.trap("未チェックパス");
\r
795 sum+=ev_array[i];//sum += ev->v[i];
\r
797 for(int i = 0; i < ev.getClm(); i++ ){//for(int i = 0; i < ev->clm; i++ ){
\r
798 NyARException.trap("未チェックパス");
\r
799 ev_array[i]/=sum;//ev->v[i] /= sum;
\r
803 public static NyARMat matrixAllocMul(NyARMat a, NyARMat b) throws NyARException
\r
805 NyARException.trap("未チェックのパス");
\r
806 NyARMat dest=new NyARMat(a.row, b.clm);
\r
807 NyARException.trap("未チェックのパス");
\r
808 matrixMul(dest, a, b);
\r
811 /*static double mdet(double *ap, int dimen, int rowa)*/
\r
812 private static double Det_mdet(double[][] ap, int dimen, int rowa) throws NyARException
\r
814 NyARException.trap("動作未チェック/配列化未チェック");
\r
820 for(int k = 0; k < dimen - 1; k++) {
\r
822 for(int i = k + 1; i < dimen; i++){
\r
823 // if (Math.abs(arMatrixDet_MATRIX_get(ap, i, k, rowa)) > Math.abs(arMatrixDet_MATRIX_get(ap, mmax, k, rowa))){
\r
824 if (Math.abs(ap[i][k]) > Math.abs(ap[mmax][k])){
\r
829 for (int j = k; j < dimen; j++) {
\r
830 work = ap[k][j];//work = MATRIX(ap, k, j, rowa);
\r
831 ap[k][j]=ap[mmax][j];//MATRIX(ap, k, j, rowa) = MATRIX(ap, mmax, j, rowa);
\r
832 ap[mmax][j]=work;//MATRIX(ap, mmax, j, rowa) = work;
\r
836 for(int i = k + 1; i < dimen; i++) {
\r
837 work = ap[i][k]/ ap[k][k];//work = arMatrixDet_MATRIX_get(ap, i, k, rowa) / arMatrixDet_MATRIX_get(ap, k, k, rowa);
\r
838 for (int j = k + 1; j < dimen; j++){
\r
839 //MATRIX(ap, i, j, rowa) -= work * MATRIX(ap, k, j, rowa);
\r
840 ap[i][j]-=work * ap[k][j];
\r
844 for(int i = 0; i < dimen; i++){
\r
845 det=ap[i][i];//det *= MATRIX(ap, i, i, rowa);
\r
847 for(int i = 0; i < is; i++){
\r
852 /*double arMatrixDet(ARMat *m);*/
\r
853 public static double arMatrixDet(NyARMat m) throws NyARException
\r
855 NyARException.trap("動作未チェック/配列化未チェック");
\r
856 if(m.row != m.clm){
\r
859 return Det_mdet(m.getArray(), m.row, m.clm);//return mdet(m->m, m->row, m->row);
\r