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 652 - (view) (download) (as text)

1 : bates 635 #include "dspMatrix.h"
2 :    
3 :     SEXP dspMatrix_validate(SEXP obj)
4 :     {
5 :     SEXP val;
6 :     int *Dim = INTEGER(GET_SLOT(obj, Matrix_DimSym));
7 :    
8 :     if (isString(val = check_scalar_string(GET_SLOT(obj, Matrix_uploSym),
9 :     "LU", "uplo"))) return val;
10 :     if (Dim[0] != Dim[1])
11 :     return mkString(_("Symmetric matrix must be square"));
12 :     return ScalarLogical(1);
13 :     }
14 :    
15 :     double get_norm_sp(SEXP obj, char *typstr)
16 :     {
17 :     char typnm[] = {'\0', '\0'};
18 :     int *dims = INTEGER(GET_SLOT(obj, Matrix_DimSym));
19 :     double *work = (double *) NULL;
20 :    
21 :     typnm[0] = norm_type(typstr);
22 :     if (*typnm == 'I' || *typnm == 'O') {
23 :     work = (double *) R_alloc(dims[0], sizeof(double));
24 :     }
25 :     return F77_CALL(dlansp)(typnm,
26 :     CHAR(asChar(GET_SLOT(obj, Matrix_uploSym))),
27 :     dims, REAL(GET_SLOT(obj, Matrix_xSym)),
28 :     work);
29 :     }
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 :     F77_CALL(dspcon)(CHAR(asChar(GET_SLOT(trf, Matrix_uploSym))),
52 :     dims, REAL(GET_SLOT(trf, Matrix_xSym)),
53 :     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 :     F77_CALL(dsptri)(CHAR(asChar(GET_SLOT(val, Matrix_uploSym))),
79 :     dims, REAL(GET_SLOT(val, Matrix_xSym)),
80 :     INTEGER(GET_SLOT(trf, Matrix_permSym)),
81 :     (double *) R_alloc((long) dims[0], sizeof(double)),
82 :     &info);
83 :     UNPROTECT(1);
84 :     return val;
85 :     }
86 :    
87 : bates 652 SEXP dspMatrix_matrix_solve(SEXP a, SEXP b, SEXP classedP)
88 : bates 635 {
89 : bates 652 int classed = asLogical(classedP);
90 : bates 635 SEXP trf = dspMatrix_trf(a),
91 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix")));
92 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
93 : bates 652 *bdims = (classed ? INTEGER(GET_SLOT(b, Matrix_DimSym)) :
94 :     INTEGER(getAttrib(b, R_DimSymbol)));
95 :     int n = bdims[0], nrhs = bdims[1], info;
96 :     int sz = n * nrhs;
97 :     double *bx = (classed ? REAL(GET_SLOT(b, Matrix_xSym)) : REAL(b));
98 : bates 635
99 : bates 652 if (!classed && !(isReal(b) && isMatrix(b)))
100 : bates 635 error(_("Argument b must be a numeric matrix"));
101 :     if (*adims != *bdims || bdims[1] < 1 || *adims < 1)
102 :     error(_("Dimensions of system to be solved are inconsistent"));
103 : bates 652 Memcpy(INTEGER(ALLOC_SLOT(val, Matrix_DimSym, INTSXP, 2)), bdims, 2);
104 : bates 635 F77_CALL(dsptrs)(CHAR(asChar(GET_SLOT(trf, Matrix_uploSym))),
105 : bates 652 &n, &nrhs, REAL(GET_SLOT(trf, Matrix_xSym)),
106 : bates 635 INTEGER(GET_SLOT(trf, Matrix_permSym)),
107 : bates 652 Memcpy(REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, sz)),
108 :     bx, sz), &n, &info);
109 : bates 635 UNPROTECT(1);
110 :     return val;
111 :     }
112 :    
113 :     SEXP dspMatrix_as_dsyMatrix(SEXP from)
114 :     {
115 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dsyMatrix"))),
116 :     uplo = GET_SLOT(from, Matrix_uploSym),
117 :     dimP = GET_SLOT(from, Matrix_DimSym),
118 :     dmnP = GET_SLOT(from, Matrix_DimNamesSym);
119 :     int n = *INTEGER(dimP);
120 :    
121 :     SET_SLOT(val, Matrix_rcondSym,
122 :     duplicate(GET_SLOT(from, Matrix_rcondSym)));
123 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
124 :     SET_SLOT(val, Matrix_DimNamesSym, duplicate(dmnP));
125 :     SET_SLOT(val, Matrix_uploSym, duplicate(uplo));
126 :     packed_to_full(REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, n*n)),
127 :     REAL(GET_SLOT(from, Matrix_xSym)), n,
128 :     *CHAR(STRING_ELT(uplo, 0)) == 'U' ? UPP : LOW);
129 :     UNPROTECT(1);
130 :     return val;
131 :     }
132 :    
133 : bates 652 SEXP dspMatrix_matrix_mm(SEXP a, SEXP b, SEXP classedP)
134 : bates 635 {
135 : bates 652 int classed = asLogical(classedP);
136 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix"))),
137 :     bdimP = (classed ? GET_SLOT(b, Matrix_DimSym) :
138 :     getAttrib(b, R_DimSymbol));
139 : bates 635 int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
140 : bates 652 *bdims = INTEGER(bdimP);
141 :     int i, ione = 1, n = bdims[0], nrhs = bdims[1], info;
142 :     int sz = n * nrhs;
143 : bates 635 char *uplo = CHAR(STRING_ELT(GET_SLOT(a, Matrix_uploSym), 0));
144 : bates 652 double *ax = REAL(GET_SLOT(a, Matrix_xSym)), one = 1., zero = 0.,
145 :     *bx = (classed ? REAL(GET_SLOT(b, Matrix_xSym)) : REAL(b)),
146 :     *vx = REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, sz));
147 : bates 635
148 :     if (bdims[0] != n)
149 :     error(_("Matrices are not conformable for multiplication"));
150 :     if (nrhs < 1 || n < 1)
151 :     error(_("Matrices with zero extents cannot be multiplied"));
152 : bates 652
153 :     SET_SLOT(val, Matrix_DimSym, duplicate(bdimP));
154 : bates 635 for (i = 0; i < nrhs; i++)
155 : bates 652 F77_CALL(dspmv)(uplo, &n, &one, ax, bx + i * n, &ione,
156 : bates 635 &zero, vx + i * n, &ione);
157 :     UNPROTECT(1);
158 :     return val;
159 :     }
160 :    
161 :     SEXP dspMatrix_trf(SEXP x)
162 :     {
163 :     SEXP val = get_factors(x, "pBunchKaufman"),
164 :     dimP = GET_SLOT(x, Matrix_DimSym),
165 :     uploP = GET_SLOT(x, Matrix_uploSym);
166 :     int *dims = INTEGER(dimP), *perm, info;
167 :     int n = dims[0];
168 :     char *uplo = CHAR(STRING_ELT(uploP, 0));
169 :    
170 :     if (val != R_NilValue) return val;
171 :     dims = INTEGER(dimP);
172 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("pBunchKaufman")));
173 :     SET_SLOT(val, Matrix_uploSym, duplicate(uploP));
174 :     SET_SLOT(val, Matrix_diagSym, mkString("N"));
175 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
176 :     SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(x, Matrix_xSym)));
177 :     perm = INTEGER(ALLOC_SLOT(val, Matrix_permSym, INTSXP, n));
178 :     F77_CALL(dsptrf)(uplo, dims, REAL(GET_SLOT(val, Matrix_xSym)), perm, &info);
179 :     if (info) error(_("Lapack routine %s returned error code %d"), "dsptrf", info);
180 :     UNPROTECT(1);
181 :     return set_factors(x, val, "pBunchKaufman");
182 :     }
183 :    

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