Пример #1
0
        public static ZIntDescriptor Diag_array(ZIntDescriptor a) // Заполнение -1 ближайшей не равной 0 величиной
        {
            int            ind1 = a.ind1;
            int            ind2 = a.ind2;
            ZIntDescriptor b    = new ZIntDescriptor(ind1, ind2);

            //MessageBox.Show(" ind1 -- " + ind1 + " ind2 -- " + ind2);
            for (int j = -ind1; j <= ind2; j++)
            {
                //a.SetValue(j, -2);
                //MessageBox.Show(" j= " + j + " a.GetValue(j) = " + a.GetValue(j));
                if (a.GetValue(j) < 0)
                {
                    par par1 = Left(a, j);
                    par par2 = Right(a, j);
                    int bmin = a.GetValue(par1.i);              // Индекс левого элемента
                    int bmax = a.GetValue(par2.i);              // Индекс правого элемента
                    //MessageBox.Show(" j= " + j + " min_left= " + par1.s + " min_right= " + par2.s + " il= " + bmin + " ir= " + bmax);
                    if (par1.s < par2.s)
                    {
                        b.SetValue(j, bmin);
                    }
                    else
                    {
                        b.SetValue(j, bmax);
                    }
                }
                else
                {
                    b.SetValue(j, a.GetValue(j));
                }
            }
            return(b);
        }
Пример #2
0
        public static ZIntDescriptor Diag(ZIntDescriptor a, int N1_sin, int N2_sin, int N_diag)
        {
            //int M = M1 * N1;
            //int N = M2 * N2;
            int MN = N1_sin * N2_sin;

            China(N1_sin, N2_sin);
            int m1 = M1;
            int n1 = N1;
            int m2 = M2;
            int n2 = N2;

            for (int i = 0; i < N2_sin; i++)         // Строка
            {
                int b = ((m2 * n2 * i) % MN) / N1_sin;
                if (b < N_diag)
                {
                    a.SetValue(i, b);
                }
                else
                {
                    a.SetValue(i, -1);
                }
            }
            int i1 = N1_sin;

            for (int j = -N1_sin + 1; j < 0; j++)    // Столбец
            {
                int b = ((m1 * n1 * (-j)) % MN) / N1_sin;
                if (b < N_diag)
                {
                    a.SetValue(j, b);
                }
                else
                {
                    a.SetValue(j, -1);
                }
                i1--;
            }
            return(a);
        }
Пример #3
0
        // Таблица увеличивается на множитель точности

        public static ZIntDescriptor  Diag_array_Mngtl(ZIntDescriptor a, int Mngtl)
        {
            if (Mngtl == 1)
            {
                return(a);
            }

            int            n1 = a.ind1 * Mngtl;
            int            n2 = a.ind2 * Mngtl;
            ZIntDescriptor b  = new ZIntDescriptor(n1, n2);
            int            i1 = a.ind1;

            for (int i = -n1; i < 0; i += Mngtl)
            {
                i1 = i / Mngtl;
                //if (i1>a.ind2) MessageBox.Show("i " + i + " i1 " + i1);
                int c = a.GetValue(i1);

                for (int j = 0; j < Mngtl; j++)
                {
                    b.SetValue(i + j, c);
                }
            }

            for (int i = 0; i <= n2 - Mngtl; i += Mngtl)
            {
                i1 = i / Mngtl;
                //if (i1>a.ind2) MessageBox.Show("i " + i + " i1 " + i1);
                int c = a.GetValue(i1);

                for (int j = 0; j < Mngtl; j++)
                {
                    b.SetValue(i + j, c);
                }
            }

            return(b);
        }