/// <summary> /// Retransforms this instance. /// </summary> /// <returns></returns> public DataMatrix Retransform(int levelCount) { var matrix = new DataMatrix(MatrixType.Retransformed, this.ColumnCount); foreach (DataRow row in this.Rows) { int halfGroupCount = this.ColumnCount; var tmpRow = row.RowValues.ToArray(); for (int currentLevel = 0; currentLevel < levelCount; currentLevel++) { halfGroupCount = halfGroupCount / 2; int groupLen = Convert.ToInt32(Math.Pow(2.0, currentLevel)); for (int j = 0; j < halfGroupCount; j++) { var r = tmpRow.ToList().ToArray(); var s = tmpRow.ToList().ToArray(); var groupOffset = (this.ColumnCount * j) / halfGroupCount; for (int i = 0; i < groupLen; i++) { var a = tmpRow[groupOffset + i]; var d = tmpRow[groupOffset + groupLen + i]; r[i] = (a + d) / Math.Sqrt(2.0); s[i] = (a - d) / Math.Sqrt(2.0); // r[i] = (tmpRow[p + i] + tmpRow[p + h + i]) / Math.Sqrt(2.0); // s[i] = (tmpRow[p + i] - tmpRow[p + h + i]) / Math.Sqrt(2.0); } for (int i = 0; i < groupLen; i++) { tmpRow[groupOffset + (2 * i)] = r[i]; tmpRow[groupOffset + (2 * i) + 1] = s[i]; } } } for (int i = 0; i < tmpRow.Count(); i++) { tmpRow[i] = Math.Round(tmpRow[i], 0); } var nr = new DataRow(tmpRow); matrix.Rows.Add(nr); } return(matrix); }
/// <summary> /// Retransforms this instance. /// </summary> /// <returns></returns> public DataMatrix Retransform(int levelCount) { var matrix = new DataMatrix(MatrixType.Retransformed, this.ColumnCount); foreach (DataRow row in this.Rows) { int halfGroupCount = this.ColumnCount; var tmpRow = row.RowValues.ToArray(); for (int currentLevel = 0; currentLevel < levelCount; currentLevel++) { halfGroupCount = halfGroupCount / 2; int groupLen = Convert.ToInt32(Math.Pow(2.0, currentLevel)); for (int j = 0; j < halfGroupCount; j++) { var r = tmpRow.ToList().ToArray(); var s = tmpRow.ToList().ToArray(); var groupOffset = (this.ColumnCount * j) / halfGroupCount; for (int i = 0; i < groupLen; i++) { var a = tmpRow[groupOffset + i]; var d = tmpRow[groupOffset + groupLen + i]; r[i] = (a + d) / Math.Sqrt(2.0); s[i] = (a - d) / Math.Sqrt(2.0); // r[i] = (tmpRow[p + i] + tmpRow[p + h + i]) / Math.Sqrt(2.0); // s[i] = (tmpRow[p + i] - tmpRow[p + h + i]) / Math.Sqrt(2.0); } for (int i = 0; i < groupLen; i++) { tmpRow[groupOffset + (2 * i)] = r[i]; tmpRow[groupOffset + (2 * i) + 1] = s[i]; } } } for (int i = 0; i < tmpRow.Count(); i++) { tmpRow[i] = Math.Round(tmpRow[i], 0); } var nr = new DataRow(tmpRow); matrix.Rows.Add(nr); } return matrix; }
/// <summary> /// The transform single step. /// </summary> /// <param name="row">The row.</param> /// <param name="step">The step.</param> /// <returns></returns> public List<DataGroup> TransformSingleStep(int row, int step) { var matrixOrig = new DataMatrix(this.UntransformedAsciiFilePath); Trace.WriteLine(string.Format("Original matrix ascii import completed, imported {0} rows.", matrixOrig.Rows.Count)); var dataRow = matrixOrig.Rows[row]; var groups = dataRow.CalculateTransformedGroups(step); return groups; }
/// <summary> /// Transforms all rows. /// </summary> public void TransformAllRows() { this.OriginalMatrix = new DataMatrix(this.UntransformedAsciiFilePath); Trace.WriteLine(string.Format("Original matrix ascii import completed, imported {0} rows.", this.OriginalMatrix.Rows.Count)); var matrixTrans = new DataMatrix(MatrixType.Transformed, this.OriginalMatrix.ColumnCount); // transform row by row for (int i = 0; i < this.OriginalMatrix.Rows.Count; i++) { // use the required level var groups = this.OriginalMatrix.Rows[i].CalculateTransformedGroups(this.OriginalMatrix.MaxLevelCount); matrixTrans.Rows.Add(new DataRow(groups)); } // create output ascii file for transformed matrix matrixTrans.WriteToAsciiFile(this.TransformedAsciiFilePath); this.TransformedMatrix = matrixTrans; }