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 635 - (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 :     SEXP dspMatrix_dgeMatrix_solve(SEXP a, SEXP b)
88 :     {
89 :     SEXP trf = dspMatrix_trf(a),
90 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("dgeMatrix")));
91 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
92 :     *bdims = INTEGER(GET_SLOT(b, Matrix_DimSym)),
93 :     info;
94 :    
95 :     if (*adims != *bdims || bdims[1] < 1 || *adims < 1)
96 :     error(_("Dimensions of system to be solved are inconsistent"));
97 :     SET_SLOT(val, Matrix_DimSym, duplicate(GET_SLOT(b, Matrix_DimSym)));
98 :     SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(b, Matrix_xSym)));
99 :     F77_CALL(dsptrs)(CHAR(asChar(GET_SLOT(trf, Matrix_uploSym))),
100 :     adims, bdims + 1,
101 :     REAL(GET_SLOT(trf, Matrix_xSym)),
102 :     INTEGER(GET_SLOT(trf, Matrix_permSym)),
103 :     REAL(GET_SLOT(val, Matrix_xSym)),
104 :     bdims, &info);
105 :     UNPROTECT(1);
106 :     return val;
107 :     }
108 :    
109 :     SEXP dspMatrix_matrix_solve(SEXP a, SEXP b)
110 :     {
111 :     SEXP trf = dspMatrix_trf(a),
112 :     val = PROTECT(duplicate(b));
113 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
114 :     *bdims = INTEGER(getAttrib(b, R_DimSymbol)),
115 :     info;
116 :    
117 :     if (!(isReal(b) && isMatrix(b)))
118 :     error(_("Argument b must be a numeric matrix"));
119 :     if (*adims != *bdims || bdims[1] < 1 || *adims < 1)
120 :     error(_("Dimensions of system to be solved are inconsistent"));
121 :     F77_CALL(dsptrs)(CHAR(asChar(GET_SLOT(trf, Matrix_uploSym))),
122 :     adims, bdims + 1,
123 :     REAL(GET_SLOT(trf, Matrix_xSym)),
124 :     INTEGER(GET_SLOT(trf, Matrix_permSym)),
125 :     REAL(val), bdims, &info);
126 :     UNPROTECT(1);
127 :     return val;
128 :     }
129 :    
130 :     SEXP dspMatrix_as_dsyMatrix(SEXP from)
131 :     {
132 :     SEXP val = PROTECT(NEW_OBJECT(MAKE_CLASS("dsyMatrix"))),
133 :     uplo = GET_SLOT(from, Matrix_uploSym),
134 :     dimP = GET_SLOT(from, Matrix_DimSym),
135 :     dmnP = GET_SLOT(from, Matrix_DimNamesSym);
136 :     int n = *INTEGER(dimP);
137 :    
138 :     SET_SLOT(val, Matrix_rcondSym,
139 :     duplicate(GET_SLOT(from, Matrix_rcondSym)));
140 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
141 :     SET_SLOT(val, Matrix_DimNamesSym, duplicate(dmnP));
142 :     SET_SLOT(val, Matrix_uploSym, duplicate(uplo));
143 :     packed_to_full(REAL(ALLOC_SLOT(val, Matrix_xSym, REALSXP, n*n)),
144 :     REAL(GET_SLOT(from, Matrix_xSym)), n,
145 :     *CHAR(STRING_ELT(uplo, 0)) == 'U' ? UPP : LOW);
146 :     UNPROTECT(1);
147 :     return val;
148 :     }
149 :    
150 :     SEXP dspMatrix_dgeMatrix_mm(SEXP a, SEXP b)
151 :     {
152 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
153 :     *bdims = INTEGER(GET_SLOT(b, Matrix_DimSym));
154 :     int i, ione = 1, n = adims[0], nrhs = bdims[1];
155 :     SEXP val = PROTECT(duplicate(b));
156 :     char *uplo = CHAR(STRING_ELT(GET_SLOT(a, Matrix_uploSym), 0));
157 :     double *ax = REAL(GET_SLOT(a, Matrix_xSym)),
158 :     *vx = REAL(GET_SLOT(val, Matrix_xSym)), one = 1., zero = 0.;
159 :    
160 :     if (bdims[0] != n)
161 :     error(_("Matrices are not conformable for multiplication"));
162 :     if (nrhs < 1 || n < 1)
163 :     error(_("Matrices with zero extents cannot be multiplied"));
164 :     for (i = 0; i < nrhs; i++)
165 :     F77_CALL(dspmv)(uplo, &n, &one, ax, vx + i * n, &ione,
166 :     &zero, vx + i * n, &ione);
167 :     UNPROTECT(1);
168 :     return val;
169 :     }
170 :    
171 :     SEXP dspMatrix_matrix_mm(SEXP a, SEXP b)
172 :     {
173 :     int *adims = INTEGER(GET_SLOT(a, Matrix_DimSym)),
174 :     *bdims = INTEGER(getAttrib(b, R_DimSymbol));
175 :     int i, ione = 1, n = adims[0], nrhs = bdims[1];
176 :     SEXP val = PROTECT(duplicate(b));
177 :     char *uplo = CHAR(STRING_ELT(GET_SLOT(a, Matrix_uploSym), 0));
178 :     double *ax = REAL(GET_SLOT(a, Matrix_xSym)),
179 :     *vx = REAL(val), one = 1., zero = 0.;
180 :    
181 :     if (bdims[0] != n)
182 :     error(_("Matrices are not conformable for multiplication"));
183 :     if (nrhs < 1 || n < 1)
184 :     error(_("Matrices with zero extents cannot be multiplied"));
185 :     for (i = 0; i < nrhs; i++)
186 :     F77_CALL(dspmv)(uplo, &n, &one, ax, vx + i * n, &ione,
187 :     &zero, vx + i * n, &ione);
188 :     UNPROTECT(1);
189 :     return val;
190 :     }
191 :    
192 :     SEXP dspMatrix_trf(SEXP x)
193 :     {
194 :     SEXP val = get_factors(x, "pBunchKaufman"),
195 :     dimP = GET_SLOT(x, Matrix_DimSym),
196 :     uploP = GET_SLOT(x, Matrix_uploSym);
197 :     int *dims = INTEGER(dimP), *perm, info;
198 :     int n = dims[0];
199 :     char *uplo = CHAR(STRING_ELT(uploP, 0));
200 :    
201 :     if (val != R_NilValue) return val;
202 :     dims = INTEGER(dimP);
203 :     val = PROTECT(NEW_OBJECT(MAKE_CLASS("pBunchKaufman")));
204 :     SET_SLOT(val, Matrix_uploSym, duplicate(uploP));
205 :     SET_SLOT(val, Matrix_diagSym, mkString("N"));
206 :     SET_SLOT(val, Matrix_DimSym, duplicate(dimP));
207 :     SET_SLOT(val, Matrix_xSym, duplicate(GET_SLOT(x, Matrix_xSym)));
208 :     perm = INTEGER(ALLOC_SLOT(val, Matrix_permSym, INTSXP, n));
209 :     F77_CALL(dsptrf)(uplo, dims, REAL(GET_SLOT(val, Matrix_xSym)), perm, &info);
210 :     if (info) error(_("Lapack routine %s returned error code %d"), "dsptrf", info);
211 :     UNPROTECT(1);
212 :     return set_factors(x, val, "pBunchKaufman");
213 :     }
214 :    

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