blob: c2e56a2c9941ec7d7c17afbe794a920e244ca8a1 [file] [log] [blame]
#include "../../Eigen/Core"
extern "C" {
int ilaslc_(int *m, int *n, float *a, int *lda);
int iladlc_(int *m, int *n, double *a, int *lda);
int ilaclc_(int *m, int *n, std::complex<float> *a, int *lda);
int ilazlc_(int *m, int *n, std::complex<double> *a, int *lda);
int ilaslr_(int *m, int *n, float *a, int *lda);
int iladlr_(int *m, int *n, double *a, int *lda);
int ilaclr_(int *m, int *n, std::complex<float> *a, int *lda);
int ilazlr_(int *m, int *n, std::complex<double> *a, int *lda);
}
using Eigen::ColMajor;
using Eigen::Dynamic;
using Eigen::Map;
using Eigen::Matrix;
using Eigen::OuterStride;
// Scan a matrix for its last non-zero column.
template <typename T>
int ilaxlc(const int m, const int n, T *a, const int lda) {
if (n == 0) return 0;
using MatrixType =
Map<Matrix<T, Dynamic, Dynamic, ColMajor>, 0, OuterStride<>>;
MatrixType a_matrix(a, m, n, OuterStride<>(lda));
// Quick test for the common case where one corner is non-zero.
if ((a_matrix(0, n - 1) != T(0)) || (a_matrix(m - 1, n - 1) != T(0))) {
return n;
}
// Now scan each column from the end, returning with the first non-zero.
int c = n - 1;
for (; c >= 0; --c) {
if ((a_matrix.array().col(c) != T(0)).any()) {
break;
}
}
return c + 1;
}
int ilaslc_(int *m, int *n, float *a, int *lda) {
return ilaxlc(*m, *n, a, *lda);
}
int iladlc_(int *m, int *n, double *a, int *lda) {
return ilaxlc(*m, *n, a, *lda);
}
int ilaclc_(int *m, int *n, std::complex<float> *a, int *lda) {
return ilaxlc(*m, *n, a, *lda);
}
int ilazlc_(int *m, int *n, std::complex<double> *a, int *lda) {
return ilaxlc(*m, *n, a, *lda);
}
// Scan a matrix for its last non-zero row.
template <typename T>
int ilaxlr(const int m, const int n, T *a, const int lda) {
if (m == 0) return m;
using MatrixType =
Map<Matrix<T, Dynamic, Dynamic, ColMajor>, 0, OuterStride<>>;
MatrixType a_matrix(a, m, n, OuterStride<>(lda));
// Quick test for the common case where one corner is non-zero.
if ((a_matrix(m - 1, 0) != T(0)) || (a_matrix(m - 1, n - 1) != T(0))) {
return m;
}
// Now scan each rowfrom the end, returning with the first non-zero.
int r = m - 1;
for (; r >= 0; --r) {
if ((a_matrix.array().row(r) == T(0)).any()) {
break;
}
}
return r + 1;
}
int ilaslr_(int *m, int *n, float *a, int *lda) {
return ilaxlr(*m, *n, a, *lda);
}
int iladlr_(int *m, int *n, double *a, int *lda) {
return ilaxlr(*m, *n, a, *lda);
}
int ilaclr_(int *m, int *n, std::complex<float> *a, int *lda) {
return ilaxlr(*m, *n, a, *lda);
}
int ilazlr_(int *m, int *n, std::complex<double> *a, int *lda) {
return ilaxlr(*m, *n, a, *lda);
}