private static async Task <int[, ]> GetGallagerParityMatrix(int rows, int columns) { int blocksCount = _wc; int[,] firstSetOfRows = new int[rows / blocksCount, columns]; for (int i = 0; i < firstSetOfRows.GetLength(0); i++) { for (int j = i * _wr; j < (i + 1) * _wr; j++) { firstSetOfRows[i, j] = 1; } } Console.WriteLine("firstSetOfRows"); MatrixOperation.ShowMatrix(firstSetOfRows); TaskFactory <SetInfo> taskFactory = new TaskFactory <SetInfo>(); Task <SetInfo>[] tasks = new Task <SetInfo> [blocksCount]; tasks[0] = taskFactory.StartNew(() => { return(new SetInfo(firstSetOfRows, 0)); }); for (int i = 1; i < blocksCount; i++) { int counter = i; tasks[i] = taskFactory.StartNew(() => CreateSet(firstSetOfRows, counter)); } SetInfo parityMatrixinfo = await taskFactory.ContinueWhenAll(tasks, completedTasks => { int[,] parityCheckMatrix = new int[rows, columns]; foreach (var task in completedTasks) { SetInfo set = task.Result; int matrixCounter = 0; for (int i = set.Matrix.GetLength(0) * set.Number; i < set.Matrix.GetLength(0) * (set.Number + 1); i++) { for (int j = 0; j < set.Matrix.GetLength(1); j++) { parityCheckMatrix[i, j] = set.Matrix[matrixCounter, j]; } matrixCounter++; } } return(new SetInfo(parityCheckMatrix, 0)); }); return(parityMatrixinfo.Matrix); }
static void Main() { Facade facade = new Facade(); int[,] matrix = new int[28, 28]; Random rand = new Random(0); for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { matrix[i, j] = rand.Next(100) < 50 ? 0 : 1; } } try { int[,] encodedMatrix = facade.Encode(matrix, 0).Result; Console.WriteLine("Закодированная"); MatrixOperation.ShowMatrix(encodedMatrix); facade.CreateMistakes(encodedMatrix); Console.WriteLine("Зашумленная"); MatrixOperation.ShowMatrix(encodedMatrix); int[,] decodedMatrix = facade.Decode(encodedMatrix).Result; Console.WriteLine("Декодированная"); MatrixOperation.ShowMatrix(decodedMatrix); Console.WriteLine("Исходная"); MatrixOperation.ShowMatrix(matrix); for (int i = 0; i < decodedMatrix.GetLength(0); i++) { for (int j = 0; j < decodedMatrix.GetLength(1); j++) { if (decodedMatrix[i, j] != matrix[i, j]) { Console.WriteLine("Различия в {0} строке {1} столбце", i, j); } } } } catch (Exception ex) { } System.Threading.Thread.Sleep(3600 * 1000); }
public async Task <int[, ]> Encode(int[,] matrix, int rank) { if (_parityMatrix == null) { _parityMatrix = await ParityMatrixCreator.Create(matrix.GetLength(0), matrix.GetLength(1), 8, 4, _rank); } Console.WriteLine("Проверочная"); MatrixOperation.ShowMatrix(_parityMatrix); return(await new EncoderCPU().Encode(matrix, _parityMatrix, ParityMatrixCreator.Gap)); }
private static int[,] GetEncodeMatrix(int[,] parityMatrix, out int gap) { int[,] parityMatrixCopy = (int[, ])parityMatrix.Clone(); int permutations = 0; for (int i = 0; i < parityMatrixCopy.GetLength(0) - permutations; i++) { if (parityMatrixCopy[i, parityMatrixCopy.GetLength(1) - 1] == 1) { MatrixOperation.PermuteRow(parityMatrixCopy, i, parityMatrixCopy.GetLength(0) - 1); permutations++; i = 0; } } gap = permutations - 1; // номер столбца, с которым мы работаем int p = parityMatrixCopy.GetLength(1) - 2; int j = 2; for (; ;) { int diagonalRow = parityMatrixCopy.GetLength(0) - (gap + j); if (diagonalRow < 0) { break; } int columnWithMinOnes = 0; int minOnesInColumn = Int32.MaxValue; for (int column = 0; column <= p; column++) { int onesInColumn = 0; for (int row = 0; row <= diagonalRow; row++) { if (parityMatrixCopy[row, column] == 1) { onesInColumn++; } } if (onesInColumn < minOnesInColumn && onesInColumn > 0) { minOnesInColumn = onesInColumn; columnWithMinOnes = column; } } MatrixOperation.PermuteColumn(parityMatrixCopy, columnWithMinOnes, p); int rowWithOne = 0; for (int row = 0; row <= diagonalRow; row++) { if (parityMatrixCopy[row, p] == 1) { rowWithOne = row; break; } } MatrixOperation.PermuteRow(parityMatrixCopy, rowWithOne, diagonalRow); if (minOnesInColumn > 1) { for (int i = 0; i < minOnesInColumn - 1; i++) { rowWithOne = 0; for (int row = 0; row < diagonalRow; row++) { if (parityMatrixCopy[row, p] == 1) { rowWithOne = row; break; } } MatrixOperation.PermuteRow(parityMatrixCopy, rowWithOne, parityMatrixCopy.GetLength(0) - 1); gap++; diagonalRow--; } } j++; p--; } int[,] gaussMatrix = GetGaussMatrix(parityMatrixCopy, gap); parityMatrixCopy = MatrixOperation.LogicMultiplicateMatrixes(gaussMatrix, parityMatrixCopy); Console.WriteLine("Проверочная"); MatrixOperation.ShowMatrix(parityMatrixCopy); return(parityMatrixCopy); }