示例#1
0
        /// <summary>
        /// Получает новую таблицу из расширенной
        /// </summary>
        /// <returns>Финальная таблица для данной итерации табличных преобразований</returns>
        public IterTableStruct getNewMatrix(double real_math_exp, double real_stand_deviation)
        {
            // Получение индексов искомых элементов
            int[] indexes_rows = InterpolSearch.SeacrhInTheThreeItemsArray(_table_rows, real_math_exp);
            int[] indexes_cols = InterpolSearch.SeacrhInTheThreeItemsArray(_table_cols, real_stand_deviation);

            // Формируем таблицу

            double[,] final_matrix = new double[2, 2];

            final_matrix[0, 0] = _a[indexes_rows[0], indexes_cols[0]];
            final_matrix[0, 1] = _a[indexes_rows[0], indexes_cols[1]];
            final_matrix[1, 0] = _a[indexes_rows[1], indexes_cols[0]];
            final_matrix[1, 1] = _a[indexes_rows[1], indexes_cols[1]];

            // Получаем заголовки строк получившейся таблицы

            double[] final_rows = new double[2];

            for (int i = 0; i < 2; i++)
            {
                final_rows[i] = _table_rows[indexes_rows[i]];
            }

            // Получаем заголовки столбцов таблицы

            double[] final_cols = new double[2];

            for (int i = 0; i < 2; i++)
            {
                final_cols[i] = _table_cols[indexes_cols[i]];
            }

            // Формируем ответ

            IterTableStruct result = new IterTableStruct();

            result.matrix         = final_matrix;
            result.column_headers = final_cols;
            result.row_headers    = final_rows;

            return(result);
        }
示例#2
0
        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="iterTable">Структура, содержащая таблицу, а также заголовки её столбцов и строк</param>
        public TableExtender(IterTableStruct iterTable)
        {
            double[,] inp_matrix = iterTable.matrix;
            double[] inp_rows    = iterTable.row_headers;
            double[] inp_columns = iterTable.column_headers;

            // Непосредственно табличные значения
            _a[0, 0] = inp_matrix[0, 0];
            _a[0, 2] = inp_matrix[0, 1];
            _a[2, 0] = inp_matrix[1, 0];
            _a[2, 2] = inp_matrix[1, 1];

            // Заголовки для строк
            _table_rows[0] = inp_rows[0];
            _table_rows[2] = inp_rows[1];

            // Заголовки для столбцов
            _table_cols[0] = inp_columns[0];
            _table_cols[2] = inp_columns[1];
        }
示例#3
0
        public void TestTableExtend()
        {
            IterTableStruct input_table = new IterTableStruct();

            input_table.row_headers = new double[2] {
                145, 150
            };
            input_table.column_headers = new double[2] {
                20, 22
            };
            input_table.matrix = new double[2, 2] {
                { 41.6, 35 }, { 44.3, 37.2 }
            };

            IterTableStruct expect_table = new IterTableStruct();

            expect_table.row_headers = new double[2] {
                145, 147.5
            };
            expect_table.column_headers = new double[2] {
                20, 21
            };
            expect_table.matrix = new double[2, 2] {
                { 41.6, 38.3 }, { 42.95, 39.525 }
            };

            TableExtender test_extender = new TableExtender(input_table);

            test_extender.extend();
            IterTableStruct real_result = test_extender.getNewMatrix(146, 20.3);

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    try
                    {
                        Assert.AreEqual(real_result.matrix[i, j], expect_table.matrix[i, j]);
                    }

                    catch (Exception e)
                    {
                        Console.WriteLine("Matrix test id failed. This is real meaning: " + real_result.matrix[i, j] + "; and expected: " + expect_table.matrix[i, j]);
                        throw e;
                    }
                }
            }

            for (int i = 0; i < 2; i++)
            {
                try
                {
                    Assert.AreEqual(real_result.column_headers[i], expect_table.column_headers[i]);
                }

                catch (Exception e)
                {
                    Console.WriteLine("Column headers test id failed. This is real meaning: " + real_result.column_headers[i] + "; and expected: " + expect_table.column_headers[i]);
                    throw e;
                }

                try
                {
                    Assert.AreEqual(real_result.row_headers[i], expect_table.row_headers[i]);
                }

                catch (Exception e)
                {
                    Console.WriteLine("Row headers test id failed. This is real meaning: " + real_result.row_headers[i] + "; and expected: " + expect_table.row_headers[i]);
                    throw e;
                }
            }
        }
        /// <summary>
        /// Непосредственно вычисление значения
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void вычислениеЗначенияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                using (var calcDlg = new calculateDlg())                                                                       // Создаём экземпляр диалоговой формы
                {
                    var result = calcDlg.ShowDialog();                                                                         // Вызываем диалоговую форму, запрашиваем у пользователя входные данные

                    if (result == DialogResult.OK)                                                                             // Постараюсь как можно внятнее растолковать, что тут происходит...
                    {
                        double[] full_table_head_rows = getDoubleValuesFromHeadersOfRows();                                    // Заголовки строк для области данных во всей таблице
                        double[] full_table_head_cols = getDoubleValuesFromHeadersOfColumns();                                 // Заголовки для столбцов из области данных во всей таблице
                        double[,] full_table_data = getDoubleValuesFromData();                                                 // Непосредственно табличные значения из области данных, тоже вся таблица

                        int[] iter_matrix_rows_indexes = InterpolSearch.Execute(full_table_head_rows, calcDlg.hammingDist);    // Индексы заголовков строк искомых элементов в массиве, созданном выше. Важный момент, этот индекс не соответствует индексу из таблицы, что у пользователя на экране.
                        int[] iter_matrix_cols_indexes = InterpolSearch.Execute(full_table_head_cols, calcDlg.standDeviation); // Индексы заголовков столбцов для искомых в таблице данных

                        double[] iter_matrix_row_heads = new double[2];                                                        // Непосредственно заголовки строк искомых элементов
                        double[] iter_matrix_col_heads = new double[2];                                                        // Заголовки столбцов искомых элементов

                        for (int i = 0; i < 2; i++)                                                                            // Присваиваем значения двум последним массивам
                        {
                            iter_matrix_col_heads[i] = full_table_head_cols[iter_matrix_cols_indexes[i]];
                            iter_matrix_row_heads[i] = full_table_head_rows[iter_matrix_rows_indexes[i]];
                        }

                        double[,] iter_matrix = new double[2, 2]; // Здесь будут храниться табличные данные, над которыми будут производиться вычисления

                        // Запись преобразуемых табличных данных в двумерный массив, который будет обрабатываться дальше
                        for (int i = 0; i < 2; i++)
                        {
                            for (int j = 0; j < 2; j++)
                            {
                                iter_matrix[i, j] = full_table_data[iter_matrix_rows_indexes[i], iter_matrix_cols_indexes[j]];
                            }
                        }

                        string full_answer_str = ""; // Эта строка содержит полный ответ, который затем будет выведен в файл
                        string tmp_ans_str;          // Строка, куда будут записываться промежуточные результаты

                        tmp_ans_str = string.Format("Усреднение найденных значений: {0} бит", EntropyCalculator.calculate(iter_matrix));
                        MessageBox.Show(tmp_ans_str);                                                                                                                // Выводим среднее значение
                        full_answer_str += tmp_ans_str + '\n';                                                                                                       // Записываем

                        double iter_entropy = 0;                                                                                                                     // Значение энтропии, вычисленное на каждой итерации

                        IterTableStruct iter_table = new IterTableStruct();                                                                                          // Структура таблицы
                        iter_table.matrix         = iter_matrix;                                                                                                     // Записываем начальные табличные значения
                        iter_table.row_headers    = iter_matrix_row_heads;                                                                                           // Записывам заголовки строк
                        iter_table.column_headers = iter_matrix_col_heads;                                                                                           // Записываем заголовки столбцов

                        bool continue_iter = true;                                                                                                                   // Логическая переменная, отвечающая за то, продолжать ли вычисления
                        uint counter       = 0;                                                                                                                      // Счётчик итераций

                        while (continue_iter)                                                                                                                        // Пока пользователь говорит, что хочет продолжить
                        {
                            TableExtender iterTableExter = new TableExtender(iter_table);                                                                            // Создаём экземпляр класса для расширения таблицы на текущей итерации
                            iterTableExter.extend();                                                                                                                 // Расширяем таблицу

                            iter_table = iterTableExter.getNewMatrix(calcDlg.hammingDist, calcDlg.standDeviation);                                                   // Получаем новую таблицу

                            iter_entropy = EntropyCalculator.calculate(iter_table.matrix);                                                                           // Вычисляем среднее значение энтропии на данной итерации

                            tmp_ans_str      = string.Format("Результат по {0}-й итерации: {1} бит", Convert.ToString(counter + 1), Convert.ToString(iter_entropy)); // Записываем промежуточный результат
                            continue_iter    = ErrorHandler.processingQuestion(tmp_ans_str + ". Продолжить вычисления?");                                            // Выводим промежуточный результат
                            full_answer_str += tmp_ans_str + '\n';                                                                                                   // И записываем его в ответ

                            if (continue_iter)
                            {
                                counter++; // Увеличиваем счётчик
                            }
                        }

                        string file_name = "ans.txt"; // Имя файла для записи

                        if (File.Exists(file_name))   // Если он существует - удаляем
                        {
                            File.Delete(file_name);
                        }

                        using (FileStream file = File.OpenWrite(file_name))                     // Создаём файловый поток для создания файла и работы с ним
                            using (StreamWriter writer = new StreamWriter(file, Encoding.UTF8)) // Создаём поток для записи в файл
                                writer.Write(full_answer_str);                                  // Записываем данные в файл

                        Process.Start(file_name);                                               // Запускаем файл
                    }
                }
            }

            catch (Exception ex)
            {
                ErrorHandler.showErrorMessage(ex.Message + '\n' + ex.StackTrace);
            }
        }