diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs
index bef5bc34..da2837c4 100644
--- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs
+++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex.cs
@@ -697,6 +697,108 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
SafeNativeMethods.z_qr_factor(rowsR, columnsR, r, tau, q, work, work.Length);
}
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(Complex[] q, int rowsA, int columnsA, Complex[] r, Complex[] tau)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ var work = new Complex[columnsA * Control.BlockSize];
+ SafeNativeMethods.z_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// The work array. The array must have a length of at least N,
+ /// but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal
+ /// work size value.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(Complex[] q, int rowsA, int columnsA, Complex[] r, Complex[] tau, Complex[] work)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (work == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(
+ string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ if (work.Length < columnsA * Control.BlockSize)
+ {
+ work[0] = columnsA * Control.BlockSize;
+ throw new ArgumentException(Resources.WorkArrayTooSmall, "work");
+ }
+
+ SafeNativeMethods.z_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
///
/// Solves A*X=B for X using QR factorization of A.
///
diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs
index fffdbfd8..bf358352 100644
--- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs
+++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Complex32.cs
@@ -696,6 +696,108 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
SafeNativeMethods.c_qr_factor(rowsR, columnsR, r, tau, q, work, work.Length);
}
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(Complex32[] q, int rowsA, int columnsA, Complex32[] r, Complex32[] tau)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ var work = new Complex32[columnsA * Control.BlockSize];
+ SafeNativeMethods.c_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// The work array. The array must have a length of at least N,
+ /// but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal
+ /// work size value.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(Complex32[] q, int rowsA, int columnsA, Complex32[] r, Complex32[] tau, Complex32[] work)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (work == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(
+ string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ if (work.Length < columnsA * Control.BlockSize)
+ {
+ work[0] = columnsA * Control.BlockSize;
+ throw new ArgumentException(Resources.WorkArrayTooSmall, "work");
+ }
+
+ SafeNativeMethods.c_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
///
/// Solves A*X=B for X using QR factorization of A.
///
diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs
index 02991cdb..ee2ec1f0 100644
--- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs
+++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.Single.cs
@@ -697,6 +697,108 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
SafeNativeMethods.s_qr_factor(rowsR, columnsR, r, tau, q, work, work.Length);
}
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(float[] q, int rowsA, int columnsA, float[] r, float[] tau)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ var work = new float[columnsA * Control.BlockSize];
+ SafeNativeMethods.s_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
+ ///
+ /// Computes the thin QR factorization of A where M > N.
+ ///
+ /// On entry, it is the M by N A matrix to factor. On exit,
+ /// it is overwritten with the Q matrix of the QR factorization.
+ /// The number of rows in the A matrix.
+ /// The number of columns in the A matrix.
+ /// On exit, A N by N matrix that holds the R matrix of the
+ /// QR factorization.
+ /// A min(m,n) vector. On exit, contains additional information
+ /// to be used by the QR solve routine.
+ /// The work array. The array must have a length of at least N,
+ /// but should be N*blocksize. The blocksize is machine dependent. On exit, work[0] contains the optimal
+ /// work size value.
+ /// This is similar to the GEQRF and ORGQR LAPACK routines.
+ [SecuritySafeCritical]
+ public override void ThinQRFactor(float[] q, int rowsA, int columnsA, float[] r, float[] tau, float[] work)
+ {
+ if (r == null)
+ {
+ throw new ArgumentNullException("r");
+ }
+
+ if (q == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (work == null)
+ {
+ throw new ArgumentNullException("q");
+ }
+
+ if (q.Length != rowsA * columnsA)
+ {
+ throw new ArgumentException(string.Format(Resources.ArgumentArrayWrongLength, "rowsR * columnsR"), "q");
+ }
+
+ if (tau.Length < Math.Min(rowsA, columnsA))
+ {
+ throw new ArgumentException(string.Format(Resources.ArrayTooSmall, "min(m,n)"), "tau");
+ }
+
+ if (r.Length != columnsA * columnsA)
+ {
+ throw new ArgumentException(
+ string.Format(Resources.ArgumentArrayWrongLength, "columnsA * columnsA"), "r");
+ }
+
+ if (work.Length < columnsA * Control.BlockSize)
+ {
+ work[0] = columnsA * Control.BlockSize;
+ throw new ArgumentException(Resources.WorkArrayTooSmall, "work");
+ }
+
+ SafeNativeMethods.s_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
+ }
+
///
/// Solves A*X=B for X using QR factorization of A.
///
diff --git a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.double.cs b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.double.cs
index 673fdd74..ddbadc2a 100644
--- a/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.double.cs
+++ b/src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.double.cs
@@ -741,7 +741,6 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
SafeNativeMethods.d_qr_thin_factor(rowsA, columnsA, q, tau, r, work, work.Length);
}
-
///
/// Computes the thin QR factorization of A where M > N.
///