SCM

SCM Repository

[matrix] Annotation of /pkg/src/dspMatrix.c
ViewVC logotype

Annotation of /pkg/src/dspMatrix.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 952 - (view) (download) (as text)

1 : bates 635 #include "dspMatrix.h"
2 :    
3 : maechler 945 /* Note: also used for lspMatrix */
4 : bates 635 SEXP dspMatrix_validate(SEXP obj)
5 :     {
6 : maechler 890 SEXP val = symmetricMatrix_validate(obj);
7 :     if(isString(val))
8 :     return(val);
9 :     else { /* identical to the test in dtpMatrix_validate() : */
10 :     int *dims = INTEGER(GET_SLOT(obj, Matrix_DimSym));
11 :     if (dims[0] != packed_ncol(length(GET_SLOT(obj, Matrix_xSym))))
12 :     return(mkString(_("Incorrect length of 'x' slot")));
13 :     return ScalarLogical(1);
14 :     }
15 : bates 635 }
16 :    
17 :     double get_norm_sp(SEXP obj, char *typstr)
18 :     {
19 :     char typnm[] = {'\0', '\0'};
20 :     int *dims = INTEGER(GET_SLOT(obj, Matrix_DimSym));
21 :     double *work = (double *) NULL;
22 :    
23 :     typnm[0] = norm_type(typstr);
24 :     if (*typnm == 'I' || *typnm == 'O') {
25 : maechler 951 work = (double *) R_alloc(dims[0], sizeof(double));
26 : bates 635 }
27 : maechler 951 return F77_CALL(dlansp)(typnm, uplo_P(obj), dims,
28 :     REAL(GET_SLOT(obj, Matrix_xSym)), work);
29 : bates 635 }
30 :    
31 :     SEXP dspMatrix_norm(SEXP obj, SEXP type)
32 :     {
33 :     return ScalarReal(get_norm_sp(obj, CHAR(asChar(type))));
34 :     }
35 :    
36 :     static
37 :     double set_rcond_sp(SEXP obj, char *typstr)
38 :     {
39 :     char typnm[] = {'\0', '\0'};
40 :     SEXP rcv = GET_SLOT(obj, Matrix_rcondSym);
41 :     double rcond;
42 :    
43 :     typnm[0] = rcond_type(typstr);
44 :     rcond = get_double_by_name(rcv, typnm);
45 :    
46 :     if (R_IsNA(rcond)) {
47 :     SEXP trf = dspMatrix_trf(obj);
48 :     int *dims = INTEGER(GET_SLOT(obj, Matrix_DimSym)), info;
49 :     double anorm = get_norm_sp(obj, "O");
50 :    
51 : maechler 951 F77_CALL(dspcon)(uplo_P(trf), dims,
52 :     REAL (GET_SLOT(trf, Matrix_xSym)),
53 : bates 635 INTEGER(GET_SLOT(trf, Matrix_permSym)),
54 :     &anorm, &rcond,
55 :     (double *) R_alloc(2*dims[0], sizeof(double)),
56 :     (int *) R_alloc(dims[0], sizeof(int)), &info);
57 :     SET_SLOT(obj, Matrix_rcondSym,
58 :     set_double_by_name(rcv, rcond, typnm));
59 :     }
60 :     return rcond;
61 :     }
62 :    
63 :     SEXP dspMatrix_rcond(SEXP obj, SEXP type)
64 :     {
65 :     return ScalarReal(set_rcond_sp(obj, CHAR(asChar(type))));
66 :     }
67 :    
68 :     SEXP dspMatrix_solve(SEXP a)
69 :     {
70 :     SEXP trf = dspMatrix_trf(a);
71 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dspMatrix")));
72 :     int *dims = INTEGER(GET_SLOT(trf, Matrix_DimSym)), info;
73 :    
74 :     SET_SLOT(val, Matrix_uploSym, duplicate(GET_SLOT(trf, Matrix_uploSym)));
75 :     SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(trf, Matrix_xSym)));
76 :     SET_SLOT(val, Matrix_DimSym, duplicate(GET_SLOT(trf, Matrix_DimSym)));
77 :     SET_SLOT(val, Matrix_rcondSym, duplicate(GET_SLOT(a, Matrix_rcondSym)));
78 : maechler 951 F77_CALL(dsptri)(uplo_P(val), dims, REAL(GET_SLOT(val, Matrix_xSym)),
79 : bates 635 INTEGER(GET_SLOT(trf, Matrix_permSym)),
80 :     (double *) R_alloc((long) dims[0], sizeof(double)),
81 :     &info);
82 :     UNPROTECT(1);
83 :     return val;
84 :     }
85 :    
86 : bates 652 SEXP dspMatrix_matrix_solve(SEXP a, SEXP b, SEXP classedP)
87 : bates 635 {
88 : bates 652 int classed = asLogical(classedP);
89 : bates 635 SEXP trf = dspMatrix_trf(a),
90 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix")));
91 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
92 : bates 652 *bdims = (classed ? INTEGER(GET_SLOT(b, Matrix_DimSym)) :
93 :     INTEGER(getAttrib(b, R_DimSymbol)));
94 :     int n = bdims[0], nrhs = bdims[1], info;
95 :     int sz = n * nrhs;
96 :     double *bx = (classed ? REAL(GET_SLOT(b, Matrix_xSym)) : REAL(b));
97 : bates 635
98 : bates 652 if (!classed && !(isReal(b) && isMatrix(b)))
99 : bates 635 error(_("Argument b must be a numeric matrix"));
100 :     if (*adims != *bdims || bdims[1] < 1 || *adims < 1)
101 :     error(_("Dimensions of system to be solved are inconsistent"));
102 : bates 652 Memcpy(INTEGER(ALLOC_SLOT(val, Matrix_DimSym, INTSXP, 2)), bdims, 2);
103 : maechler 951 F77_CALL(dsptrs)(uplo_P(trf),
104 : bates 652 &n, &nrhs, REAL(GET_SLOT(trf, Matrix_xSym)),
105 : bates 635 INTEGER(GET_SLOT(trf, Matrix_permSym)),
106 : bates 652 Memcpy(REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, sz)),
107 :     bx, sz), &n, &info);
108 : bates 635 UNPROTECT(1);
109 :     return val;
110 :     }
111 :    
112 :     SEXP dspMatrix_as_dsyMatrix(SEXP from)
113 :     {
114 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dsyMatrix"))),
115 :     uplo = GET_SLOT(from, Matrix_uploSym),
116 :     dimP = GET_SLOT(from, Matrix_DimSym),
117 :     dmnP = GET_SLOT(from, Matrix_DimNamesSym);
118 :     int n = *INTEGER(dimP);
119 :    
120 :     SET_SLOT(val, Matrix_rcondSym,
121 :     duplicate(GET_SLOT(from, Matrix_rcondSym)));
122 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
123 :     SET_SLOT(val, Matrix_DimNamesSym, duplicate(dmnP));
124 :     SET_SLOT(val, Matrix_uploSym, duplicate(uplo));
125 : maechler 952 packed_to_full_double(REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, n*n)),
126 :     REAL(GET_SLOT(from, Matrix_xSym)), n,
127 :     *CHAR(STRING_ELT(uplo, 0)) == 'U' ? UPP : LOW);
128 : bates 635 UNPROTECT(1);
129 :     return val;
130 :     }
131 :    
132 : bates 652 SEXP dspMatrix_matrix_mm(SEXP a, SEXP b, SEXP classedP)
133 : bates 635 {
134 : bates 652 int classed = asLogical(classedP);
135 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix"))),
136 :     bdimP = (classed ? GET_SLOT(b, Matrix_DimSym) :
137 :     getAttrib(b, R_DimSymbol));
138 : maechler 655 int *bdims = INTEGER(bdimP);
139 :     int i, ione = 1, n = bdims[0], nrhs = bdims[1];
140 : bates 652 int sz = n * nrhs;
141 : maechler 951 char *uplo = uplo_P(a);
142 : bates 652 double *ax = REAL(GET_SLOT(a, Matrix_xSym)), one = 1., zero = 0.,
143 :     *bx = (classed ? REAL(GET_SLOT(b, Matrix_xSym)) : REAL(b)),
144 :     *vx = REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, sz));
145 : bates 635
146 :     if (bdims[0] != n)
147 :     error(_("Matrices are not conformable for multiplication"));
148 :     if (nrhs < 1 || n < 1)
149 :     error(_("Matrices with zero extents cannot be multiplied"));
150 : maechler 655
151 : bates 652 SET_SLOT(val, Matrix_DimSym, duplicate(bdimP));
152 : bates 635 for (i = 0; i < nrhs; i++)
153 : bates 652 F77_CALL(dspmv)(uplo, &n, &one, ax, bx + i * n, &ione,
154 : bates 635 &zero, vx + i * n, &ione);
155 :     UNPROTECT(1);
156 :     return val;
157 :     }
158 :    
159 :     SEXP dspMatrix_trf(SEXP x)
160 :     {
161 :     SEXP val = get_factors(x, "pBunchKaufman"),
162 :     dimP = GET_SLOT(x, Matrix_DimSym),
163 :     uploP = GET_SLOT(x, Matrix_uploSym);
164 :     int *dims = INTEGER(dimP), *perm, info;
165 :     int n = dims[0];
166 :     char *uplo = CHAR(STRING_ELT(uploP, 0));
167 :    
168 :     if (val != R_NilValue) return val;
169 :     dims = INTEGER(dimP);
170 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("pBunchKaufman")));
171 :     SET_SLOT(val, Matrix_uploSym, duplicate(uploP));
172 :     SET_SLOT(val, Matrix_diagSym, mkString("N"));
173 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
174 :     SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(x, Matrix_xSym)));
175 :     perm = INTEGER(ALLOC_SLOT(val, Matrix_permSym, INTSXP, n));
176 :     F77_CALL(dsptrf)(uplo, dims, REAL(GET_SLOT(val, Matrix_xSym)), perm, &info);
177 :     if (info) error(_("Lapack routine %s returned error code %d"), "dsptrf", info);
178 :     UNPROTECT(1);
179 :     return set_factors(x, val, "pBunchKaufman");
180 :     }
181 :    

root@r-forge.r-project.org
ViewVC Help
Powered by ViewVC 1.0.0  
Thanks to:
Vienna University of Economics and Business Powered By FusionForge