Esempio n. 1
0
        /// <summary>
        /// Multiplication of two rows from two matrices respectively.
        /// </summary>
        /// <param name="matrix"></param>
        /// <param name="row"></param>
        /// <param name="other"></param>
        /// <param name="otherRow"></param>
        /// <returns></returns>
        public static double RowMultiplication(this DenseMatrix <double> matrix, int row, DenseMatrix <double> other, int otherRow)
        {
            double sum = 0.0;

            for (int i = 0; i < matrix.NumberOfColumns; i++)
            {
                sum += matrix[row, i] * other[otherRow, i];
            }
            return(sum);
        }
Esempio n. 2
0
        /// <summary>
        /// Inverse of a matrix.
        /// </summary>
        /// <param name="matrix">The inversed matrix</param>
        /// <returns></returns>
        public static DenseMatrix <double> Inverse(this DenseMatrix <double> matrix)
        {
            int m = matrix.NumberOfRows;
            int n = matrix.NumberOfColumns;

            double[,] array = new double[2 * m + 1, 2 * n + 1];
            for (int k = 0; k < 2 * m + 1; k++)  // Initialize
            {
                for (int t = 0; t < 2 * n + 1; t++)
                {
                    array[k, t] = 0.00000000;
                }
            }
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    array[i, j] = matrix[i, j];
                }
            }

            for (int k = 0; k < m; k++)
            {
                for (int t = n; t <= 2 * n; t++)
                {
                    if ((t - k) == m)
                    {
                        array[k, t] = 1.0;
                    }
                    else
                    {
                        array[k, t] = 0;
                    }
                }
            }
            //得到逆矩阵
            for (int k = 0; k < m; k++)
            {
                if (array[k, k] != 1)
                {
                    double bs = array[k, k];
                    array[k, k] = 1;
                    for (int p = k + 1; p < 2 * n; p++)
                    {
                        array[k, p] /= bs;
                    }
                }
                for (int q = 0; q < m; q++)
                {
                    if (q != k)
                    {
                        double bs = array[q, k];
                        for (int p = 0; p < 2 * n; p++)
                        {
                            array[q, p] -= bs * array[k, p];
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            DenseMatrix <double> NI = new DenseMatrix <double>(m, n);

            for (int x = 0; x < m; x++)
            {
                for (int y = n; y < 2 * n; y++)
                {
                    NI[x, y - n] = array[x, y];
                }
            }
            return(NI);
        }