/// <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); }
/// <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]; }
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); } }