Esempio n. 1
0
        public void add(CMatrix m)
        {
            int n = _size;

            while ((n--) != 0)
            {
                _m[n].add(m[n]);
            }
        }
Esempio n. 2
0
        public void substract(CMatrix m)
        {
            int n = _size;

            while ((n--) != 0)
            {
                _m[n].substract(m[n]);
            }
        }
Esempio n. 3
0
 public CMatrix(CMatrix m)
 {
     _size = m.size;
     _m    = new CVector[_size];
     for (int i = 0; i < _size; i++)
     {
         _m[i] = new CVector(m._m[i]);
     }
 }
Esempio n. 4
0
        public static CEigen calculate(CMatrix covarian)
        {
            int n = covarian.size + 1;

            double  [,] buff = new double[n, n];
            double  [,] z    = new double[n, n];
            double   [] d    = new double[n];
            int      [] flag = new int[n];

            int i, j;

            for (i = 1; i < n; i++)
            {
                for (j = 1; j < n; j++)
                {
                    buff[i, j] = covarian[i - 1][j - 1];
                }
            }
            n--;

            sevd.symmetricevd(buff, n, 1, true, ref d, ref z);

            for (i = 0; i < n; i++)
            {
                d[i]    = d[i + 1];
                flag[i] = i;
            }
            d[i] = 0.0;

            // urutin dulu d dan z
            Array.Sort(d, flag, new CEigenComparer());

            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    buff[i, j] = z[i + 1, flag[j] + 1];
                }
            }

            return(new CEigen(n, buff, d));
        }
Esempio n. 5
0
        public CMatrix inverse()
        {
            CMatrix a = new CMatrix(this);
            CMatrix b = new CMatrix(_size, false);
            int     i, j, i1;

            for (j = 0; j < _size; j++)
            {
                i1 = j;
                for (i = j + 1; i < _size; i++)
                {
                    if (Math.Abs(a[i][j]) > Math.Abs(a[i1][j]))
                    {
                        i1 = i;
                    }
                }

                a.swapRow(i1, j);
                b.swapRow(i1, j);

                if (a[j][j] == 0)
                {
                    return(null);
                }
                b[j].divide(a[j][j]);
                a[j].divide(a[j][j]);

                for (i = 0; i < _size; i++)
                {
                    if (i != j)
                    {
                        b[i].substract(b[j].multiplyCopy(a[i][j]));
                        a[i].substract(a[j].multiplyCopy(a[i][j]));
                    }
                }
            }
            return(b);
        }