예제 #1
0
        public static CellArray Multiply(CellArray A, CellArray B)
        {
            if (!CellArray.IsMatrix(A) || !CellArray.IsMatrix(B))
            {
                throw new Exception("Both A and B must be matrixes");
            }

            int A_Rows = A.Count, B_Rows = B.Count;
            int A_Cols = CellArray.ColumnCount(A), B_Cols = CellArray.ColumnCount(B);

            if (A_Cols != B_Rows)
            {
                throw new Exception(string.Format("Dimension mismatch A {0}:{1} B {2}:{3}", A_Rows, A_Cols, B_Rows, B_Cols));
            }

            CellArray C = CellArray.Matrix(A_Rows, B_Cols);

            // Main Loop //
            for (int i = 0; i < A_Rows; i++)
            {
                // Sub Loop One //
                for (int j = 0; j < B_Cols; j++)
                {
                    // Sub Loop Two //
                    for (int k = 0; k < A_Cols; k++)
                    {
                        C[i].valueARRAY[j] = (C[i].valueARRAY[j].IsNull ? A[i].valueARRAY[k] * B[k].valueARRAY[j] : A[i].valueARRAY[k] * B[k].valueARRAY[j] + C[i].valueARRAY[j]);
                    }
                }
            }

            // Return C //
            return(C);
        }
예제 #2
0
            public CellArray getMatrix(CellArray A, int[] r, int j0, int j1)
            {
                CellArray X = CellArray.Matrix(r.Length, j1 - j0 + 1);

                for (int i = 0; i < r.Length; i++)
                {
                    for (int j = j0; j <= j1; j++)
                    {
                        X[i].ARRAY[j - j0] = A[r[i]].ARRAY[j];
                    }
                }

                return(X);
            }
예제 #3
0
            public CellArray getU()
            {
                CellArray X = CellArray.Matrix(n, n);

                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        if (i <= j)
                        {
                            X[i].ARRAY[j] = LU[i].ARRAY[j];
                        }
                        else
                        {
                            X[i].ARRAY[j] = CellValues.Zero(CellAffinity.DOUBLE);
                        }
                    }
                }
                return(X);
            }
예제 #4
0
        public static CellArray Transpose(CellArray A)
        {
            int Rows    = A.Count;
            int Columns = 0;

            if (!CellArray.IsMatrix(A, out Columns))
            {
                throw new Exception("Cannot transpose a non-matrix");
            }

            CellArray B = CellArray.Matrix(Columns, Rows);

            for (int i = 0; i < Rows; i++)
            {
                for (int j = 0; j < Columns; j++)
                {
                    B[j].ARRAY[i] = A[i].ARRAY[j];
                }
            }
            return(B);
        }
예제 #5
0
        public static CellArray Identity(int Dimension, CellAffinity Type)
        {
            if (!CellAffinityHelper.IsNumeric(Type))
            {
                return(new CellArray());
            }

            Cell zero = CellValues.Zero(Type);
            Cell one  = CellValues.One(Type);

            CellArray x = CellArray.Matrix(Dimension, Dimension);

            for (int i = 0; i < Dimension; i++)
            {
                for (int j = 0; j < Dimension; j++)
                {
                    x[i].ARRAY[j] = (i == j ? one : zero);
                }
            }

            return(x);
        }
예제 #6
0
            public CellArray getL()
            {
                CellArray L = CellArray.Matrix(m, n);

                for (int i = 0; i < m; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        if (i > j)
                        {
                            L[i].ARRAY[j] = LU[i].ARRAY[j];
                        }
                        else if (i == j)
                        {
                            L[i].ARRAY[j] = CellValues.One(CellAffinity.DOUBLE);
                        }
                        else
                        {
                            L[i].ARRAY[j] = CellValues.Zero(CellAffinity.DOUBLE);
                        }
                    }
                }
                return(L);
            }
예제 #7
0
 public static CellArray Matrix(int RowLength, int ColumnLength)
 {
     return(CellArray.Matrix(RowLength, ColumnLength, CellAffinity.DOUBLE));
 }
예제 #8
0
 public static CellArray Matrix(int RowLength, int ColumnLength, CellAffinity Affinity)
 {
     return(CellArray.Matrix(RowLength, ColumnLength, new Cell(Affinity)));
 }