74 | | int dim = D.length(); |
75 | | double kr; |
76 | | vec r = v; |
77 | | //beware! it is potentionally dangerous, if ITpp change _behaviour of _data()! |
78 | | double *Lraw = L._data(); |
79 | | double *Draw = D._data(); |
80 | | double *rraw = r._data(); |
81 | | |
82 | | bdm_assert_debug ( v.length() == dim, "LD::ldupdt vector v is not compatible with this ld." ); |
83 | | |
84 | | for ( int i = dim - 1; i >= 0; i-- ) { |
85 | | dydr ( rraw, Lraw + i, &w, Draw + i, rraw + i, 0, i, &kr, 1, dim ); |
86 | | } |
| 74 | int dim = D.length(); |
| 75 | double kr; |
| 76 | vec r = v; |
| 77 | //beware! it is potentionally dangerous, if ITpp change _behaviour of _data()! |
| 78 | double *Lraw = L._data(); |
| 79 | double *Draw = D._data(); |
| 80 | double *rraw = r._data(); |
| 81 | |
| 82 | bdm_assert_debug ( v.length() == dim, "LD::ldupdt vector v is not compatible with this ld." ); |
| 83 | |
| 84 | for ( int i = dim - 1; i >= 0; i-- ) { |
| 85 | dydr ( rraw, Lraw + i, &w, Draw + i, rraw + i, 0, i, &kr, 1, dim ); |
| 86 | } |
96 | | int dim = D.length(); |
97 | | mat V ( dim, dim ); |
98 | | double sum; |
99 | | int r, c, cc; |
100 | | |
101 | | for ( r = 0; r < dim; r++ ) { //row cycle |
102 | | for ( c = r; c < dim; c++ ) { |
103 | | //column cycle, using symmetricity => c=r! |
104 | | sum = 0.0; |
105 | | for ( cc = c; cc < dim; cc++ ) { //cycle over the remaining part of the vector |
106 | | sum += L ( cc, r ) * D ( cc ) * L ( cc, c ); |
107 | | //here L(cc,r) = L(r,cc)'; |
108 | | } |
109 | | V ( r, c ) = sum; |
110 | | // symmetricity |
111 | | if ( r != c ) { |
112 | | V ( c, r ) = sum; |
113 | | }; |
114 | | } |
115 | | } |
116 | | //mat V2 = L.transpose() * diag ( D ) * L; |
117 | | return V; |
| 96 | int dim = D.length(); |
| 97 | mat V ( dim, dim ); |
| 98 | double sum; |
| 99 | int r, c, cc; |
| 100 | |
| 101 | for ( r = 0; r < dim; r++ ) { //row cycle |
| 102 | for ( c = r; c < dim; c++ ) { |
| 103 | //column cycle, using symmetricity => c=r! |
| 104 | sum = 0.0; |
| 105 | for ( cc = c; cc < dim; cc++ ) { //cycle over the remaining part of the vector |
| 106 | sum += L ( cc, r ) * D ( cc ) * L ( cc, c ); |
| 107 | //here L(cc,r) = L(r,cc)'; |
| 108 | } |
| 109 | V ( r, c ) = sum; |
| 110 | // symmetricity |
| 111 | if ( r != c ) { |
| 112 | V ( c, r ) = sum; |
| 113 | }; |
| 114 | } |
| 115 | } |
| 116 | //mat V2 = L.transpose() * diag ( D ) * L; |
| 117 | return V; |
228 | | int m = A.rows(); |
229 | | int n = A.cols(); |
230 | | int mn = ( m < n ) ? m : n ; |
231 | | |
232 | | bdm_assert_debug ( D0.length() == A.rows(), "ldmat::ldform Vector D must have the length as row count of A" ); |
233 | | |
234 | | L = concat_vertical ( zeros ( n, n ), diag ( sqrt ( D0 ) ) * A ); |
235 | | D = zeros ( n + m ); |
236 | | |
237 | | //unnecessary big L and D will be made smaller at the end of file |
238 | | vec w = zeros ( n + m ); |
239 | | |
240 | | double sum, beta, pom; |
241 | | |
242 | | int cc = 0; |
243 | | int i = n; // indexovani o 1 niz, nez v matlabu |
244 | | int ii, j, jj; |
245 | | while ( ( i > n - mn - cc ) && ( i > 0 ) ) { |
246 | | i--; |
247 | | sum = 0.0; |
248 | | |
249 | | int last_v = m + i - n + cc + 1; |
250 | | |
251 | | vec v = zeros ( last_v + 1 ); //prepare v |
252 | | for ( ii = n - cc - 1; ii < m + i + 1; ii++ ) { |
253 | | sum += L ( ii, i ) * L ( ii, i ); |
254 | | v ( ii - n + cc + 1 ) = L ( ii, i ); //assign v |
255 | | } |
256 | | |
257 | | if ( L ( m + i, i ) == 0 ) |
258 | | beta = sqrt ( sum ); |
259 | | else |
260 | | beta = L ( m + i, i ) + sign ( L ( m + i, i ) ) * sqrt ( sum ); |
261 | | |
262 | | if ( std::fabs ( beta ) < eps ) { |
263 | | cc++; |
264 | | L.set_row ( n - cc, L.get_row ( m + i ) ); |
265 | | L.set_row ( m + i, zeros ( L.cols() ) ); |
266 | | D ( m + i ) = 0; |
267 | | L ( m + i, i ) = 1; |
268 | | L.set_submatrix ( n - cc, m + i - 1, i, i, 0 ); |
269 | | continue; |
270 | | } |
271 | | |
272 | | sum -= v ( last_v ) * v ( last_v ); |
273 | | sum /= beta * beta; |
274 | | sum++; |
275 | | |
276 | | v /= beta; |
277 | | v ( last_v ) = 1; |
278 | | |
279 | | pom = -2.0 / sum; |
280 | | // echo to venca |
281 | | |
282 | | for ( j = i; j >= 0; j-- ) { |
283 | | double w_elem = 0; |
284 | | for ( ii = n - cc; ii <= m + i + 1; ii++ ) |
285 | | w_elem += v ( ii - n + cc ) * L ( ii - 1, j ); |
286 | | w ( j ) = w_elem * pom; |
287 | | } |
288 | | |
289 | | for ( ii = n - cc - 1; ii <= m + i; ii++ ) |
290 | | for ( jj = 0; jj < i; jj++ ) |
291 | | L ( ii, jj ) += v ( ii - n + cc + 1 ) * w ( jj ); |
292 | | |
293 | | for ( ii = n - cc - 1; ii < m + i; ii++ ) |
294 | | L ( ii, i ) = 0; |
295 | | |
296 | | L ( m + i, i ) += w ( i ); |
297 | | D ( m + i ) = L ( m + i, i ) * L ( m + i, i ); |
298 | | |
299 | | for ( ii = 0; ii <= i; ii++ ) |
300 | | L ( m + i, ii ) /= L ( m + i, i ); |
301 | | } |
302 | | |
303 | | if ( i >= 0 ) |
304 | | for ( ii = 0; ii < i; ii++ ) { |
305 | | jj = D.length() - 1 - n + ii; |
306 | | D ( jj ) = 0; |
307 | | L.set_row ( jj, zeros ( L.cols() ) ); //TODO: set_row accepts Num_T |
308 | | L ( jj, jj ) = 1; |
309 | | } |
310 | | |
311 | | L.del_rows ( 0, m - 1 ); |
312 | | D.del ( 0, m - 1 ); |
313 | | |
314 | | dim = L.rows(); |
| 228 | int m = A.rows(); |
| 229 | int n = A.cols(); |
| 230 | int mn = ( m < n ) ? m : n ; |
| 231 | |
| 232 | bdm_assert_debug ( D0.length() == A.rows(), "ldmat::ldform Vector D must have the length as row count of A" ); |
| 233 | |
| 234 | L = concat_vertical ( zeros ( n, n ), diag ( sqrt ( D0 ) ) * A ); |
| 235 | D = zeros ( n + m ); |
| 236 | |
| 237 | //unnecessary big L and D will be made smaller at the end of file |
| 238 | vec w = zeros ( n + m ); |
| 239 | |
| 240 | double sum, beta, pom; |
| 241 | |
| 242 | int cc = 0; |
| 243 | int i = n; // indexovani o 1 niz, nez v matlabu |
| 244 | int ii, j, jj; |
| 245 | while ( ( i > n - mn - cc ) && ( i > 0 ) ) { |
| 246 | i--; |
| 247 | sum = 0.0; |
| 248 | |
| 249 | int last_v = m + i - n + cc + 1; |
| 250 | |
| 251 | vec v = zeros ( last_v + 1 ); //prepare v |
| 252 | for ( ii = n - cc - 1; ii < m + i + 1; ii++ ) { |
| 253 | sum += L ( ii, i ) * L ( ii, i ); |
| 254 | v ( ii - n + cc + 1 ) = L ( ii, i ); //assign v |
| 255 | } |
| 256 | |
| 257 | if ( L ( m + i, i ) == 0 ) |
| 258 | beta = sqrt ( sum ); |
| 259 | else |
| 260 | beta = L ( m + i, i ) + sign ( L ( m + i, i ) ) * sqrt ( sum ); |
| 261 | |
| 262 | if ( std::fabs ( beta ) < eps ) { |
| 263 | cc++; |
| 264 | L.set_row ( n - cc, L.get_row ( m + i ) ); |
| 265 | L.set_row ( m + i, zeros ( L.cols() ) ); |
| 266 | D ( m + i ) = 0; |
| 267 | L ( m + i, i ) = 1; |
| 268 | L.set_submatrix ( n - cc, m + i - 1, i, i, 0 ); |
| 269 | continue; |
| 270 | } |
| 271 | |
| 272 | sum -= v ( last_v ) * v ( last_v ); |
| 273 | sum /= beta * beta; |
| 274 | sum++; |
| 275 | |
| 276 | v /= beta; |
| 277 | v ( last_v ) = 1; |
| 278 | |
| 279 | pom = -2.0 / sum; |
| 280 | // echo to venca |
| 281 | |
| 282 | for ( j = i; j >= 0; j-- ) { |
| 283 | double w_elem = 0; |
| 284 | for ( ii = n - cc; ii <= m + i + 1; ii++ ) |
| 285 | w_elem += v ( ii - n + cc ) * L ( ii - 1, j ); |
| 286 | w ( j ) = w_elem * pom; |
| 287 | } |
| 288 | |
| 289 | for ( ii = n - cc - 1; ii <= m + i; ii++ ) |
| 290 | for ( jj = 0; jj < i; jj++ ) |
| 291 | L ( ii, jj ) += v ( ii - n + cc + 1 ) * w ( jj ); |
| 292 | |
| 293 | for ( ii = n - cc - 1; ii < m + i; ii++ ) |
| 294 | L ( ii, i ) = 0; |
| 295 | |
| 296 | L ( m + i, i ) += w ( i ); |
| 297 | D ( m + i ) = L ( m + i, i ) * L ( m + i, i ); |
| 298 | |
| 299 | for ( ii = 0; ii <= i; ii++ ) |
| 300 | L ( m + i, ii ) /= L ( m + i, i ); |
| 301 | } |
| 302 | |
| 303 | if ( i >= 0 ) |
| 304 | for ( ii = 0; ii < i; ii++ ) { |
| 305 | jj = D.length() - 1 - n + ii; |
| 306 | D ( jj ) = 0; |
| 307 | L.set_row ( jj, zeros ( L.cols() ) ); //TODO: set_row accepts Num_T |
| 308 | L ( jj, jj ) = 1; |
| 309 | } |
| 310 | |
| 311 | L.del_rows ( 0, m - 1 ); |
| 312 | D.del ( 0, m - 1 ); |
| 313 | |
| 314 | dim = L.rows(); |