8SEXP
dense_schur(SEXP obj,
const char *
class,
int warn,
int vectors)
10 int *pdim =
DIM(obj), n = pdim[1];
12 Rf_error(
_(
"matrix is not square"));
13 char cl[] =
".denseSchur";
14 cl[0] = (
class[0] ==
'z') ?
'z' :
'd';
20 PROTECT_WITH_INDEX(obj, &pid);
21 if (
class[0] !=
'z' &&
class[0] !=
'd') {
25 if ((
class[1] ==
's' &&
class[0] ==
'z' &&
TRANS(obj) !=
'C') ||
32 if (
class[1] ==
'g') {
33 PROTECT(y = Rf_allocVector(
TYPEOF(x), XLENGTH(x)));
34 PROTECT(v = Rf_allocVector(
TYPEOF(x), (vectors) ? XLENGTH(x) : 0));
35 PROTECT(w = Rf_allocVector(
TYPEOF(x), n));
36 int lwork = -1, zero = 0;
37 double *rwork = (
double *) R_alloc((
size_t) n,
sizeof(
double));
38 if (
TYPEOF(x) == CPLXSXP) {
39 Rcomplex *px = COMPLEX(x), *py = COMPLEX(y),
40 *pv = COMPLEX(v), *pw = COMPLEX(w), tmp, *work = &tmp;
41 memcpy(py, px,
sizeof(Rcomplex) * (
size_t) XLENGTH(y));
42 F77_CALL(zgees)((vectors) ?
"V" :
"N",
"N", NULL,
43 &n, py, &n, &zero, pw, pv, &n,
46 work = (Rcomplex *) R_alloc((
size_t) lwork,
sizeof(Rcomplex));
47 F77_CALL(zgees)((vectors) ?
"V" :
"N",
"N", NULL,
48 &n, py, &n, &zero, pw, pv, &n,
52 double *px = REAL(x), *py = REAL(y),
53 *pv = REAL(v), *pw = REAL(w), tmp, *work = &tmp;
54 memcpy(py, px,
sizeof(
double) * (
size_t) XLENGTH(y));
55 F77_CALL(dgees)((vectors) ?
"V" :
"N",
"N", NULL,
56 &n, py, &n, &zero, pw, rwork, pv, &n,
59 work = (
double *) R_alloc((
size_t) lwork,
sizeof(
double));
60 F77_CALL(dgees)((vectors) ?
"V" :
"N",
"N", NULL,
61 &n, py, &n, &zero, pw, rwork, pv, &n,
64 for (
int j = 0; j < n; ++j) {
65 if (fabs(rwork[j]) > 10.0 * DBL_EPSILON * fabs(pw[j])) {
66 SEXP w_ = Rf_allocVector(CPLXSXP, n);
67 Rcomplex *pw_ = COMPLEX(w_);
68 for (j = 0; j < n; ++j) {
78 }
else if (
class[2] !=
'p') {
79 PROTECT(y = Rf_allocVector(
TYPEOF(x), 0));
80 PROTECT(v = Rf_allocVector(
TYPEOF(x), XLENGTH(x)));
81 PROTECT(w = Rf_allocVector(REALSXP, n));
85 if (
TYPEOF(x) == CPLXSXP) {
86 Rcomplex *px = COMPLEX(x), *pv = COMPLEX(v), tmp, *work = &tmp;
87 double *rwork = (
double *) R_alloc((
size_t) n * 3,
sizeof(
double));
88 memcpy(pv, px,
sizeof(Rcomplex) * (
size_t) XLENGTH(v));
89 F77_CALL(zheev)((vectors) ?
"V" :
"N", &ul,
90 &n, pv, &n, pw, work, &lwork, rwork, &info
FCONE FCONE);
92 work = (Rcomplex *) R_alloc((
size_t) lwork,
sizeof(Rcomplex));
93 F77_CALL(zheev)((vectors) ?
"V" :
"N", &ul,
94 &n, pv, &n, pw, work, &lwork, rwork, &info
FCONE FCONE);
97 double *px = REAL(x), *pv = REAL(v), tmp, *work = &tmp;
98 memcpy(pv, px,
sizeof(
double) * (
size_t) XLENGTH(v));
99 F77_CALL(dsyev)((vectors) ?
"V" :
"N", &ul,
100 &n, pv, &n, pw, work, &lwork, &info
FCONE FCONE);
102 work = (
double *) R_alloc((
size_t) lwork,
sizeof(
double));
103 F77_CALL(dsyev)((vectors) ?
"V" :
"N", &ul,
104 &n, pv, &n, pw, work, &lwork, &info
FCONE FCONE);
108 PROTECT(y = Rf_allocVector(
TYPEOF(x), XLENGTH(x)));
109 PROTECT(v = Rf_allocVector(
TYPEOF(x), (vectors) ? (R_xlen_t) n * n : 0));
110 PROTECT(w = Rf_allocVector(REALSXP, n));
112 double *pw = REAL(w);
113 if (
TYPEOF(x) == CPLXSXP) {
114 Rcomplex *px = COMPLEX(x), *py = COMPLEX(y), *pv = COMPLEX(v),
115 *work = (Rcomplex *) R_alloc((
size_t) n * 2,
sizeof(Rcomplex));
116 double *rwork = (
double *) R_alloc((
size_t) n * 3,
sizeof(
double));
117 memcpy(py, px,
sizeof(Rcomplex) * (
size_t) XLENGTH(y));
118 F77_CALL(zhpev)((vectors) ?
"V" :
"N", &ul,
119 &n, py, pw, pv, &n, work, rwork, &info
FCONE FCONE);
122 double *px = REAL(x), *py = REAL(y), *pv = REAL(v),
123 *work = (
double *) R_alloc((
size_t) n * 3,
sizeof(
double));
124 memcpy(py, px,
sizeof(
double) * (
size_t) XLENGTH(y));
125 F77_CALL(dspev)((vectors) ?
"V" :
"N", &ul,