comparison src/tc-extras.cc @ 51:7806354a10d3

[project @ 1993-08-11 20:48:00 by jwe]
author jwe
date Wed, 11 Aug 1993 20:50:40 +0000
parents 78fd87e624cb
children 7849db4b6dbc
comparison
equal deleted inserted replaced
50:6028dcac27ef 51:7806354a10d3
324 break; 324 break;
325 } 325 }
326 return retval; 326 return retval;
327 } 327 }
328 328
329 // XXX FIXME XXX -- the next three functions should really be just 329 // XXX FIXME XXX -- the next two functions (and expm) should really be just
330 // one... 330 // one...
331
332 tree_constant *
333 matrix_exp (tree_constant& a)
334 {
335 tree_constant *retval = new tree_constant [2];
336
337 tree_constant tmp = a.make_numeric ();;
338
339 if (tmp.rows () == 0 || tmp.columns () == 0)
340 {
341 int flag = user_pref.propagate_empty_matrices;
342 if (flag != 0)
343 {
344 if (flag < 0)
345 gripe_empty_arg ("expm", 0);
346 Matrix m;
347 retval = new tree_constant [2];
348 retval[0] = tree_constant (m);
349 return retval;
350 }
351 else
352 gripe_empty_arg ("expm", 1);
353 }
354
355 switch (tmp.const_type ())
356 {
357 case tree_constant_rep::matrix_constant:
358 {
359 Matrix m = tmp.matrix_value ();
360
361 int nr = m.rows ();
362 int nc = m.columns ();
363
364 if (nr == 0 || nc == 0 || nr != nc)
365 gripe_square_matrix_required ("expm");
366 else
367 {
368 EIG m_eig (m);
369 ComplexColumnVector lambda (m_eig.eigenvalues ());
370 ComplexMatrix Q (m_eig.eigenvectors ());
371
372 for (int i = 0; i < nr; i++)
373 {
374 Complex elt = lambda.elem (i);
375 if (imag (elt) == 0.0)
376 lambda.elem (i) = exp (real (elt));
377 else
378 lambda.elem (i) = exp (elt);
379 }
380
381 ComplexDiagMatrix D (lambda);
382 ComplexMatrix result = Q * D * Q.inverse ();
383
384 retval[0] = tree_constant (result);
385 }
386 }
387 break;
388 case tree_constant_rep::complex_matrix_constant:
389 {
390 ComplexMatrix m = tmp.complex_matrix_value ();
391
392 int nr = m.rows ();
393 int nc = m.columns ();
394
395 if (nr == 0 || nc == 0 || nr != nc)
396 gripe_square_matrix_required ("expm");
397 else
398 {
399 EIG m_eig (m);
400 ComplexColumnVector lambda (m_eig.eigenvalues ());
401 ComplexMatrix Q (m_eig.eigenvectors ());
402
403 for (int i = 0; i < nr; i++)
404 {
405 Complex elt = lambda.elem (i);
406 if (imag (elt) == 0.0)
407 lambda.elem (i) = exp (real (elt));
408 else
409 lambda.elem (i) = exp (elt);
410 }
411
412 ComplexDiagMatrix D (lambda);
413 ComplexMatrix result = Q * D * Q.inverse ();
414
415 retval[0] = tree_constant (result);
416 }
417 }
418 break;
419 case tree_constant_rep::scalar_constant:
420 {
421 double d = tmp.double_value ();
422 retval[0] = tree_constant (exp (d));
423 }
424 break;
425 case tree_constant_rep::complex_scalar_constant:
426 {
427 Complex c = tmp.complex_value ();
428 retval[0] = tree_constant (exp (c));
429 }
430 break;
431 default:
432 break;
433 }
434 return retval;
435 }
436 331
437 tree_constant * 332 tree_constant *
438 matrix_log (tree_constant& a) 333 matrix_log (tree_constant& a)
439 { 334 {
440 tree_constant *retval = new tree_constant [2]; 335 tree_constant *retval = new tree_constant [2];