comparison liboctave/dbleSVD.cc @ 10601:3ce0c530a9c9

implement svd_driver
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 03 May 2010 13:21:35 +0200
parents 12884915a8e4
children 8a5e980da6aa
comparison
equal deleted inserted replaced
10600:036bdc2d0af0 10601:3ce0c530a9c9
27 27
28 #include <iostream> 28 #include <iostream>
29 29
30 #include "dbleSVD.h" 30 #include "dbleSVD.h"
31 #include "f77-fcn.h" 31 #include "f77-fcn.h"
32 #include "oct-locbuf.h"
32 33
33 extern "C" 34 extern "C"
34 { 35 {
35 F77_RET_T 36 F77_RET_T
36 F77_FUNC (dgesvd, DGESVD) (F77_CONST_CHAR_ARG_DECL, 37 F77_FUNC (dgesvd, DGESVD) (F77_CONST_CHAR_ARG_DECL,
39 const octave_idx_type&, double*, double*, 40 const octave_idx_type&, double*, double*,
40 const octave_idx_type&, double*, const octave_idx_type&, 41 const octave_idx_type&, double*, const octave_idx_type&,
41 double*, const octave_idx_type&, octave_idx_type& 42 double*, const octave_idx_type&, octave_idx_type&
42 F77_CHAR_ARG_LEN_DECL 43 F77_CHAR_ARG_LEN_DECL
43 F77_CHAR_ARG_LEN_DECL); 44 F77_CHAR_ARG_LEN_DECL);
45
46 F77_RET_T
47 F77_FUNC (dgesdd, DGESDD) (F77_CONST_CHAR_ARG_DECL,
48 const octave_idx_type&, const octave_idx_type&, double*,
49 const octave_idx_type&, double*, double*,
50 const octave_idx_type&, double*, const octave_idx_type&,
51 double*, const octave_idx_type&, octave_idx_type *, octave_idx_type&
52 F77_CHAR_ARG_LEN_DECL);
44 } 53 }
45 54
46 Matrix 55 Matrix
47 SVD::left_singular_matrix (void) const 56 SVD::left_singular_matrix (void) const
48 { 57 {
68 else 77 else
69 return right_sm; 78 return right_sm;
70 } 79 }
71 80
72 octave_idx_type 81 octave_idx_type
73 SVD::init (const Matrix& a, SVD::type svd_type) 82 SVD::init (const Matrix& a, SVD::type svd_type, SVD::driver svd_driver)
74 { 83 {
75 octave_idx_type info; 84 octave_idx_type info;
76 85
77 octave_idx_type m = a.rows (); 86 octave_idx_type m = a.rows ();
78 octave_idx_type n = a.cols (); 87 octave_idx_type n = a.cols ();
138 Array<double> work (1, 1); 147 Array<double> work (1, 1);
139 148
140 octave_idx_type one = 1; 149 octave_idx_type one = 1;
141 octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one); 150 octave_idx_type m1 = std::max (m, one), nrow_vt1 = std::max (nrow_vt, one);
142 151
143 F77_XFCN (dgesvd, DGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1), 152 if (svd_driver == SVD::GESVD)
144 F77_CONST_CHAR_ARG2 (&jobv, 1), 153 {
145 m, n, tmp_data, m1, s_vec, u, m1, vt, 154 F77_XFCN (dgesvd, DGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
146 nrow_vt1, work.fortran_vec (), lwork, info 155 F77_CONST_CHAR_ARG2 (&jobv, 1),
147 F77_CHAR_ARG_LEN (1) 156 m, n, tmp_data, m1, s_vec, u, m1, vt,
148 F77_CHAR_ARG_LEN (1))); 157 nrow_vt1, work.fortran_vec (), lwork, info
149 158 F77_CHAR_ARG_LEN (1)
150 lwork = static_cast<octave_idx_type> (work(0)); 159 F77_CHAR_ARG_LEN (1)));
151 work.resize (lwork, 1); 160
152 161 lwork = static_cast<octave_idx_type> (work(0));
153 F77_XFCN (dgesvd, DGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1), 162 work.resize (lwork, 1);
154 F77_CONST_CHAR_ARG2 (&jobv, 1), 163
155 m, n, tmp_data, m1, s_vec, u, m1, vt, 164 F77_XFCN (dgesvd, DGESVD, (F77_CONST_CHAR_ARG2 (&jobu, 1),
156 nrow_vt1, work.fortran_vec (), lwork, info 165 F77_CONST_CHAR_ARG2 (&jobv, 1),
157 F77_CHAR_ARG_LEN (1) 166 m, n, tmp_data, m1, s_vec, u, m1, vt,
158 F77_CHAR_ARG_LEN (1))); 167 nrow_vt1, work.fortran_vec (), lwork, info
168 F77_CHAR_ARG_LEN (1)
169 F77_CHAR_ARG_LEN (1)));
170
171 }
172 else if (svd_driver == SVD::GESDD)
173 {
174 assert (jobu == jobv);
175 char jobz = jobu;
176 OCTAVE_LOCAL_BUFFER (octave_idx_type, iwork, 8*min_mn);
177
178 F77_XFCN (dgesdd, DGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
179 m, n, tmp_data, m1, s_vec, u, m1, vt,
180 nrow_vt1, work.fortran_vec (), lwork, iwork, info
181 F77_CHAR_ARG_LEN (1)));
182
183 lwork = static_cast<octave_idx_type> (work(0));
184 work.resize (lwork, 1);
185
186 F77_XFCN (dgesdd, DGESDD, (F77_CONST_CHAR_ARG2 (&jobz, 1),
187 m, n, tmp_data, m1, s_vec, u, m1, vt,
188 nrow_vt1, work.fortran_vec (), lwork, iwork, info
189 F77_CHAR_ARG_LEN (1)));
190
191 }
192 else
193 assert (0); // impossible
159 194
160 if (! (jobv == 'N' || jobv == 'O')) 195 if (! (jobv == 'N' || jobv == 'O'))
161 right_sm = right_sm.transpose (); 196 right_sm = right_sm.transpose ();
162 197
163 return info; 198 return info;