Ejemplo n.º 1
0
        //умножение на транспонированный нижний треугольник
        public IVector LMultTranspose(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = new Vector(Size);

            for (int i = Size - 1; i >= 0; i--)
            {
                var ia1 = ia[i];     //1ый элемент строки
                var ia2 = ia[i + 1]; //последний элемент строки
                int j;
                for (; ja[ia1] < i && ia1 < ia2; ia1++)
                {
                    j          = ja[ia1];
                    result[j] += a[ia1] * vector[i];
                }
                j = ja[ia1];
                if (j == i && ia1 < ia2)
                {
                    result[j] += UseDiagonal? a[ia1] * vector[j]: (double)diagonalElement * vector[j];
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        //умножение на транспонированный верхний треугольник
        public IVector UMultTranspose(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = new Vector(Size);

            for (int i = 0; i < Size; i++)
            {
                var ia1 = ia[i];
                var ia2 = ia[i + 1] - 1;
                var j   = ja[ia2];
                for (; i < j && ia1 < ia2; ia2--)
                {
                    j          = ja[ia2];
                    result[j] += a[ia2] * vector[i];
                }
                j = ja[ia2];
                if (j == i && ia1 <= ia2)
                {
                    result[i] += UseDiagonal ? a[ia2] * vector[i] : (double)diagonalElement * vector[i];
                }
            }
            return(result);
        }
Ejemplo n.º 3
0
        public IVector UMult(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }

            var result = new Vector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] += isUseDiagonal ? matrix[i][i] * vector[i] : (int)diagonalElement * vector[i];

                for (int j = 0; j < i; j++)
                {
                    result[j] += matrix[i][j] * vector[i];
                }
            }

            return(result);
        }
Ejemplo n.º 4
0
        //умножение на нижний треугольник
        public IVector LMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = new Vector(Size);

            for (int i = 0; i < Size; i++)
            {
                double sum = 0;
                var    ia1 = ia[i];     //1ый элемент строки
                var    ia2 = ia[i + 1]; //1ый элемент следующий строки строки
                int    j;
                for (; ja[ia1] < i && ia1 < ia2; ia1++)
                {
                    j    = ja[ia1];
                    sum += a[ia1] * vector[j];
                }
                j = ja[ia1];
                if (j == i && ia1 < ia2)
                {
                    sum += UseDiagonal ?  a[ia1] * vector[j]: (double)diagonalElement * vector[j];
                }
                result[i] = sum;
            }
            return(result);
        }
Ejemplo n.º 5
0
        //умножение на верхний треугольник трансп
        public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }

            var result = new Vector(Size);

            for (int j = 0; j < Size; j++)
            {
                int k = ia[j];
                for (int i = j - (ia[j + 1] - k); i < j; i++, k++)
                {
                    result[j] += au[k] * vector[i];
                }
            }

            for (int i = 0; i < Size; i++)
            {
                result[i] += isUseDiagonal ? di[i] * vector[i] : (double)diagonalElement * vector[i];
            }

            return(result);
        }
        public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }

            var result = new Vector(Size);

            for (int i = 0; i < Size; i++)
            {
                result[i] = isUseDiagonal ? di[i] * vector[i] : (int)diagonalElement * vector[i];

                for (int j = ia[i]; j < ia[i + 1]; j++)
                {
                    var column = ja[j];
                    result[i] += au[j] * vector[column];
                }
            }

            return(result);
        }
        //умножение на верхний треугольник
        public IVector UMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = new Vector(Size);

            for (int i = Size - 1; i >= 0; i--)
            {
                var ia1 = ia[i];
                var ia2 = ia[i + 1] - 1;
                result[i] += UseDiagonal ?  a[ia2] * vector[i] : (double)diagonalElement * vector[i];
                for (ia2--; ia1 <= ia2; ia2--)
                {
                    var j = ja[ia2];
                    result[j] += a[ia2] * vector[i];
                }
            }
            return(result);
        }
        //умножение на нижний треугольник
        public IVector LMult(IVector vector, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }
            if (vector.Size != Size)
            {
                throw new RankException();
            }
            var result = new Vector(Size);

            for (int i = 0; i < Size; i++)
            {
                double sum = 0;
                var    ia1 = ia[i];
                var    ia2 = ia[i + 1];
                for (; i > ja[ia1] && ia1 < ia2; ia1++)
                {
                    var j = ja[ia1];
                    sum += a[ia1] * vector[j];
                }
                if (i == ja[ia1])
                {
                    sum += UseDiagonal ? a[ia1] * vector[i]: (double)diagonalElement * vector[i];
                }
                else
                {
                    throw new ArgumentNullException(nameof(a));
                }
                result[i] = sum;
            }
            return(result);
        }
Ejemplo n.º 9
0
        public IVector UMultTranspose(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
        {
            if (vector == null)
            {
                throw new ArgumentNullException(nameof(vector));
            }

            if (vector.Size != Size)
            {
                throw new RankException();
            }

            var result = new Vector(Size);

            for (int j = 0; j < Size; j++)
            {
                var sum = isUseDiagonal ? matrix[j, j] * vector[j] : (int)diagonalElement * vector[j];

                for (int i = 0; i < j; i++)
                {
                    sum += matrix[i, j] * vector[i];
                }

                result[j] = sum;
            }

            return(result);
        }
Ejemplo n.º 10
0
 public IVector UMult(IVector x, bool UseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One)
 {
     Counters.UMult.Inc();
     return(linear.UMult(x, UseDiagonal, diagonalElement));
 }
Ejemplo n.º 11
0
 public IVector UMult(IVector vector, bool isUseDiagonal, DiagonalElement diagonalElement = DiagonalElement.One) => Matrix.UMultTranspose(vector, isUseDiagonal, diagonalElement);