MatrixValue fft(MatrixValue x) { var length = x.Length; if (length == 1) { return(x.Clone()); } // Cooley-Tukey FFT if (length % 2 != 0) { throw new YAMPDifferentLengthsException(length, "2^n"); } // even fft var even = new MatrixValue(length / 2, 1); for (var k = 1; k <= even.Length; k++) { even[k] = x[2 * k]; } var q = fft(even); // odd fft; var odd = even; for (var k = 1; k <= odd.Length; k++) { odd[k] = x[2 * k - 1]; } var r = fft(odd); // combine var y = new MatrixValue(length, 1); for (var k = 1; k <= odd.Length; k++) { var value = -2 * (k - 1) * Math.PI / length; var wk = new ScalarValue(Math.Cos(value), Math.Sin(value)); y[k] = q[k] + (wk * r[k]); y[k + odd.Length] = q[k] - (wk * r[k]); } return(y); }
MatrixValue fft(MatrixValue x) { var length = x.Length; if (length == 1) { return x.Clone(); } // Cooley-Tukey FFT if (length % 2 != 0) throw new YAMPDifferentLengthsException(length, "2^n"); // even fft var even = new MatrixValue(length / 2, 1); for (var k = 1; k <= even.Length; k++) { even[k] = x[2 * k]; } var q = fft(even); // odd fft; var odd = even; for (var k = 1; k <= odd.Length; k++) { odd[k] = x[2 * k - 1]; } var r = fft(odd); // combine var y = new MatrixValue(length, 1); for (var k = 1; k <= odd.Length; k++) { var value = -2 * (k - 1) * Math.PI / length; var wk = new ScalarValue(Math.Cos(value), Math.Sin(value)); y[k] = q[k] + (wk * r[k]); y[k + odd.Length] = q[k] - (wk * r[k]); } return y; }
MatrixValue ifft2d(MatrixValue input) { var output = input.Clone(); // Rows first: var x = new MatrixValue(output.DimensionY, 1); for (var h = 1; h <= output.DimensionX; h++) { for (var i = 1; i <= output.DimensionY; i++) { x[i] = output[i, h]; } x = ifft(x); for (int i = 1; i <= output.DimensionY; i++) { output[i, h] = x[i]; } } //Columns last var y = new MatrixValue(output.DimensionX, 1); for (int h = 1; h <= output.DimensionY; h++) { for (int i = 1; i <= output.DimensionX; i++) { y[i] = output[h, i]; } y = ifft(y); for (int i = 1; i <= output.DimensionX; i++) { output[h, i] = y[i]; } } return(output); }
/// <summary> /// Creates a new Givens decomposition. /// </summary> /// <param name="A">The matrix to decompose.</param> public GivensDecomposition(MatrixValue A) : base(A) { var Q = MatrixValue.One(m); var R = A.Clone(); // Main loop. for (int j = 1; j < n; j++) { for (int i = m; i > j; i--) { var a = R[i - 1, j]; var b = R[i, j]; var G = MatrixValue.One(m); var beta = (a * a + b * b).Sqrt(); var s = -b / beta; var c = a / beta; G[i - 1, i - 1] = c.Conjugate(); G[i - 1, i] = -s.Conjugate(); G[i, i - 1] = s; G[i, i] = c; R = G * R; Q = Q * G.Adjungate(); } } for (int j = 0; j < n; j++) { if (R[j + 1, j + 1] == ScalarValue.Zero) { FullRank = false; } } r = R; q = Q; }
/// <summary> /// Creates a new Givens decomposition. /// </summary> /// <param name="A">The matrix to decompose.</param> public GivensDecomposition(MatrixValue A) : base(A) { var Q = MatrixValue.One(m); var R = A.Clone(); // Main loop. for (int j = 1; j < n; j++) { for (int i = m; i > j; i--) { var a = R[i - 1, j]; var b = R[i, j]; var G = MatrixValue.One(m); var beta = (a * a + b * b).Sqrt(); var s = -b / beta; var c = a / beta; G[i - 1, i - 1] = c.Conjugate(); G[i - 1, i] = -s.Conjugate(); G[i, i - 1] = s; G[i, i] = c; R = G * R; Q = Q * G.Adjungate(); } } for (int j = 0; j < n; j++) { if (R[j + 1, j + 1] == ScalarValue.Zero) FullRank = false; } r = R; q = Q; }
MatrixValue fft2d(MatrixValue input) { var output = input.Clone(); // Rows first: var x = new MatrixValue(output.DimensionY, 1); for (var h = 1; h <= output.DimensionX; h++) { for (var i = 1; i <= output.DimensionY; i++) { x[i] = output[i, h]; } x = fft(x); for (var i = 1; i <= output.DimensionY; i++) { output[i, h] = x[i]; } } //Columns last var y = new MatrixValue(output.DimensionX, 1); for (var h = 0; h < output.DimensionY; h++) { for (var i = 1; i <= output.DimensionX; i++) { y[i] = output[h, i]; } y = fft(y); for (var i = 1; i <= output.DimensionX; i++) { output[h, i] = y[i]; } } return output; }