Changeset 3313 for trunk/psLib/src/math/psMatrix.c
- Timestamp:
- Feb 23, 2005, 2:19:51 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/math/psMatrix.c (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/math/psMatrix.c
r3290 r3313 21 21 * @author Robert DeSonia, MHPCC 22 22 * 23 * @version $Revision: 1.2 4$ $Name: not supported by cvs2svn $24 * @date $Date: 2005-02- 19 00:30:07$23 * @version $Revision: 1.25 $ $Name: not supported by cvs2svn $ 24 * @date $Date: 2005-02-24 00:19:51 $ 25 25 * 26 26 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 50 50 51 51 /** Preprocessor macro to generate error for image dimensionality not set to PS_DIMEN_IMAGE */ 52 #define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, RETURN) \52 #define PS_CHECK_DIMEN_AND_TYPE(NAME, PS_DIMEN, CLEANUP) \ 53 53 if (NAME->type.dimen != PS_DIMEN) { \ 54 54 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 55 55 "Invalid operation. %s has incorrect dimensionality %d.", #NAME, PS_DIMEN); \ 56 return RETURN; \56 CLEANUP; \ 57 57 } else if(NAME->type.type!=PS_TYPE_F64 && NAME->type.type!=PS_TYPE_F32) { \ 58 58 psError(PS_ERR_BAD_PARAMETER_TYPE, true, \ 59 59 "Invalid operation. %s not PS_TYPE_F64.", #NAME); \ 60 return RETURN; \60 CLEANUP; \ 61 61 } 62 62 63 63 /** Preprocessor macro to check that input is not equal to output */ 64 #define PS_CHECK_POINTERS(NAME1, NAME2, RETURN) \64 #define PS_CHECK_POINTERS(NAME1, NAME2, CLEANUP) \ 65 65 if (NAME1 == NAME2) { \ 66 66 psError(PS_ERR_BAD_PARAMETER_VALUE, true, \ 67 67 "Invalid operation: Pointer to %s is same as %s.", #NAME1, #NAME2); \ 68 return RETURN; \68 CLEANUP; \ 69 69 } 70 70 71 71 /** Preprocessor macro to check that an image is square */ 72 #define PS_CHECK_SQUARE(NAME, RETURN) \72 #define PS_CHECK_SQUARE(NAME, CLEANUP) \ 73 73 if (NAME->numCols != NAME->numRows) { \ 74 74 psError(PS_ERR_BAD_PARAMETER_SIZE, true, "Invalid operation: %s not square array.", #NAME); \ 75 return RETURN; \75 CLEANUP; \ 76 76 } 77 77 … … 189 189 // Error checks 190 190 PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixLUD_EXIT); 191 PS_CHECK_POINTERS(inImage, outImage, outImage);192 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);191 PS_CHECK_POINTERS(inImage, outImage, psMatrixLUD_EXIT); 192 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixLUD_EXIT); 193 193 PS_PTR_CHECK_NULL_GENERAL(outPerm, psMatrixLUD_EXIT); 194 194 195 195 outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type); 196 196 197 PS_CHECK_SQUARE(inImage, outImage);198 PS_CHECK_SQUARE(outImage, outImage);197 PS_CHECK_SQUARE(inImage, psMatrixLUD_EXIT); 198 PS_CHECK_SQUARE(outImage, psMatrixLUD_EXIT); 199 199 200 200 // Initialize data … … 244 244 gsl_vector *x = NULL; 245 245 246 // Error checks 247 PS_CHECK_POINTERS(outVector, inVector, outVector); 248 PS_CHECK_POINTERS(inVector, inPerm, outVector); 249 PS_CHECK_POINTERS(outVector, inPerm, outVector); 250 PS_IMAGE_CHECK_NULL(inImage, outVector); 251 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outVector); 252 PS_IMAGE_CHECK_EMPTY(inImage, outVector); 253 PS_VECTOR_CHECK_NULL(outVector, outVector); 254 PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, outVector); 255 PS_VECTOR_CHECK_NULL(inVector, outVector); 256 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, outVector); 257 PS_VECTOR_CHECK_NULL(inPerm, outVector); 258 psVectorRecycle(outVector, inImage->numRows, inImage->type.type); 246 #define LUSOLVE_CLEANUP {psFree(outVector); return NULL;} 247 248 // Error checks 249 PS_IMAGE_CHECK_NULL_GENERAL(inImage, LUSOLVE_CLEANUP); 250 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, LUSOLVE_CLEANUP); 251 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, LUSOLVE_CLEANUP); 252 PS_VECTOR_CHECK_NULL_GENERAL(inVector, LUSOLVE_CLEANUP); 253 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, LUSOLVE_CLEANUP); 254 PS_VECTOR_CHECK_NULL_GENERAL(inPerm, LUSOLVE_CLEANUP); 255 256 outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type); 257 258 PS_CHECK_POINTERS(outVector, inVector, LUSOLVE_CLEANUP); 259 PS_CHECK_POINTERS(inVector, inPerm, LUSOLVE_CLEANUP); 260 PS_CHECK_POINTERS(outVector, inPerm, LUSOLVE_CLEANUP); 259 261 260 262 // Initialize data … … 296 298 gsl_permutation *perm = NULL; 297 299 298 // Error checks 299 PS_PTR_CHECK_NULL(det, outImage); 300 PS_CHECK_POINTERS(inImage, outImage, outImage); 301 PS_IMAGE_CHECK_NULL(inImage, outImage); 302 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage); 303 PS_IMAGE_CHECK_EMPTY(inImage, outImage); 300 #define INVERT_CLEANUP { psFree(outImage); return NULL; } 301 // Error checks 302 PS_PTR_CHECK_NULL_GENERAL(det, INVERT_CLEANUP); 303 PS_IMAGE_CHECK_NULL_GENERAL(inImage, INVERT_CLEANUP); 304 PS_CHECK_POINTERS(inImage, outImage, INVERT_CLEANUP); 305 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, INVERT_CLEANUP); 306 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, INVERT_CLEANUP); 307 304 308 outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type); 305 PS_CHECK_SQUARE(inImage, outImage); 306 PS_CHECK_SQUARE(outImage, outImage); 309 310 PS_CHECK_SQUARE(inImage, INVERT_CLEANUP); 311 PS_CHECK_SQUARE(outImage, INVERT_CLEANUP); 307 312 308 313 // Initialize data … … 341 346 gsl_permutation *perm = NULL; 342 347 343 // Error checks 344 PS_IMAGE_CHECK_NULL(inImage, NULL); 345 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, NULL); 346 PS_IMAGE_CHECK_EMPTY(inImage, NULL); 347 PS_CHECK_SQUARE(inImage, 0); 348 #define DETERMINANT_EXIT { return NULL; } 349 // Error checks 350 PS_IMAGE_CHECK_NULL_GENERAL(inImage, DETERMINANT_EXIT); 351 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, DETERMINANT_EXIT); 352 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, DETERMINANT_EXIT); 353 PS_CHECK_SQUARE(inImage, DETERMINANT_EXIT); 348 354 349 355 // Initialize data … … 376 382 gsl_matrix *m3 = NULL; 377 383 378 // Error checks 379 PS_CHECK_POINTERS(inImage1, outImage, outImage); 380 PS_CHECK_POINTERS(inImage1, inImage2, outImage); 381 PS_IMAGE_CHECK_NULL(inImage1, outImage); 382 PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, outImage); 383 PS_IMAGE_CHECK_EMPTY(inImage1, outImage); 384 PS_IMAGE_CHECK_NULL(inImage2, outImage); 385 PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, outImage); 386 PS_IMAGE_CHECK_EMPTY(inImage2, outImage); 387 PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, outImage); 384 #define MULTIPLY_CLEANUP { psFree(outImage); return NULL; } 385 386 // Error checks 387 PS_IMAGE_CHECK_NULL_GENERAL(inImage1, MULTIPLY_CLEANUP); 388 PS_IMAGE_CHECK_NULL_GENERAL(inImage2, MULTIPLY_CLEANUP); 389 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage1, MULTIPLY_CLEANUP); 390 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage2, MULTIPLY_CLEANUP); 391 PS_CHECK_DIMEN_AND_TYPE(inImage1, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP); 392 PS_CHECK_DIMEN_AND_TYPE(inImage2, PS_DIMEN_IMAGE, MULTIPLY_CLEANUP); 393 PS_CHECK_POINTERS(inImage1, outImage, MULTIPLY_CLEANUP); 394 PS_CHECK_POINTERS(inImage1, inImage2, MULTIPLY_CLEANUP); 388 395 389 396 outImage = psImageRecycle(outImage, inImage2->numCols, inImage2->numRows, inImage2->type.type); 390 397 391 PS_CHECK_SQUARE(inImage1, outImage);392 PS_CHECK_SQUARE(inImage2, outImage);393 PS_CHECK_SQUARE(outImage, outImage);398 PS_CHECK_SQUARE(inImage1, MULTIPLY_CLEANUP); 399 PS_CHECK_SQUARE(inImage2, MULTIPLY_CLEANUP); 400 PS_CHECK_SQUARE(outImage, MULTIPLY_CLEANUP); 394 401 395 402 // Initialize data … … 428 435 psS32 numColsOut = 0; 429 436 430 431 // Error checks 432 PS_CHECK_POINTERS(inImage, outImage, outImage); 433 PS_IMAGE_CHECK_NULL(inImage, outImage); 434 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage); 435 PS_IMAGE_CHECK_EMPTY(inImage, outImage); 437 #define TRANSPOSE_CLEANUP { psFree(outImage); return NULL; } 438 // Error checks 439 PS_IMAGE_CHECK_NULL_GENERAL(inImage, TRANSPOSE_CLEANUP); 440 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, TRANSPOSE_CLEANUP); 441 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, TRANSPOSE_CLEANUP); 442 PS_CHECK_POINTERS(inImage, outImage, TRANSPOSE_CLEANUP); 443 436 444 outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type); 437 445 … … 472 480 gsl_matrix *in = NULL; 473 481 474 475 // Error checks 476 PS_ CHECK_POINTERS(inImage, outImage, outImage);477 PS_ IMAGE_CHECK_NULL(inImage, outImage);478 PS_ CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outImage);479 PS_ IMAGE_CHECK_EMPTY(inImage, outImage);482 #define EIGENVECTORS_CLEANUP { psFree(outImage); return NULL; } 483 // Error checks 484 PS_IMAGE_CHECK_NULL_GENERAL(inImage, EIGENVECTORS_CLEANUP); 485 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, EIGENVECTORS_CLEANUP); 486 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, EIGENVECTORS_CLEANUP); 487 PS_CHECK_POINTERS(inImage, outImage, EIGENVECTORS_CLEANUP); 480 488 481 489 outImage = psImageRecycle(outImage, inImage->numCols, inImage->numRows, inImage->type.type); … … 494 502 495 503 // Non-square matrices not allowed 496 PS_CHECK_SQUARE(inImage, outImage);497 PS_CHECK_SQUARE(outImage, outImage);504 PS_CHECK_SQUARE(inImage, EIGENVECTORS_CLEANUP); 505 PS_CHECK_SQUARE(outImage, EIGENVECTORS_CLEANUP); 498 506 499 507 // Calculate Eigenvalues and Eigenvectors...Eigenvalues not currently used … … 520 528 // Error checks 521 529 PS_IMAGE_CHECK_NULL_GENERAL(inImage, psMatrixToVector_EXIT); 522 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, outVector);530 PS_CHECK_DIMEN_AND_TYPE(inImage, PS_DIMEN_IMAGE, psMatrixToVector_EXIT); 523 531 PS_IMAGE_CHECK_EMPTY_GENERAL(inImage, psMatrixToVector_EXIT); 524 532 525 533 if (inImage->numRows == 1) { 526 534 // Create transposed row vector 527 psVectorRecycle(outVector, inImage->numCols, inImage->type.type);535 outVector = psVectorRecycle(outVector, inImage->numCols, inImage->type.type); 528 536 outVector->type.dimen = PS_DIMEN_TRANSV; 529 537 } else if (inImage->numCols == 1) { 530 538 // Create non-transposed column vector 531 psVectorRecycle(outVector, inImage->numRows, inImage->type.type);539 outVector = psVectorRecycle(outVector, inImage->numRows, inImage->type.type); 532 540 } else { 533 541 psError(PS_ERR_BAD_PARAMETER_SIZE, true, … … 537 545 } 538 546 539 PS_VECTOR_CHECK_NULL(outVector, outVector);540 541 547 // More checks 542 548 if (outVector->type.dimen == PS_DIMEN_VECTOR) { 543 PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, outVector);549 PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_VECTOR, psMatrixToVector_EXIT); 544 550 545 551 if (outVector->n == 0) { … … 557 563 558 564 } else if (outVector->type.dimen == PS_DIMEN_TRANSV) { 559 PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, outVector);565 PS_CHECK_DIMEN_AND_TYPE(outVector, PS_DIMEN_TRANSV, psMatrixToVector_EXIT); 560 566 561 567 if (outVector->n == 0) { … … 582 588 psS32 size = 0; 583 589 584 // Error checks 585 PS_VECTOR_CHECK_NULL(inVector, outImage); 590 #define VECTORTOMATRIX_CLEANUP {psFree(outImage); return NULL; } 591 // Error checks 592 PS_VECTOR_CHECK_NULL_GENERAL(inVector, VECTORTOMATRIX_CLEANUP); 586 593 587 594 if (inVector->type.dimen == PS_DIMEN_VECTOR) { 588 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, outImage); 589 PS_VECTOR_CHECK_EMPTY(inVector, outImage); 595 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_VECTOR, VECTORTOMATRIX_CLEANUP); 596 PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP); 597 590 598 outImage = psImageRecycle(outImage, 1, inVector->n, inVector->type.type); 599 591 600 // More checks for PS_DIMEN_VECTOR 592 601 if (outImage->numCols > 1) { … … 605 614 606 615 } else if (inVector->type.dimen == PS_DIMEN_TRANSV) { 607 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, outImage);608 PS_VECTOR_CHECK_EMPTY (inVector, outImage);616 PS_CHECK_DIMEN_AND_TYPE(inVector, PS_DIMEN_TRANSV, VECTORTOMATRIX_CLEANUP); 617 PS_VECTOR_CHECK_EMPTY_GENERAL(inVector, VECTORTOMATRIX_CLEANUP); 609 618 outImage = psImageRecycle(outImage, inVector->n, 1, inVector->type.type); 610 619 // More checks for PS_DIMEN_TRANSV … … 624 633 } 625 634 626 PS_IMAGE_CHECK_NULL (outImage, outImage);627 PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, outImage);635 PS_IMAGE_CHECK_NULL_GENERAL(outImage, VECTORTOMATRIX_CLEANUP); 636 PS_CHECK_DIMEN_AND_TYPE(outImage, PS_DIMEN_IMAGE, VECTORTOMATRIX_CLEANUP); 628 637 629 638 memcpy(outImage->data.V[0], inVector->data.V, size);
Note:
See TracChangeset
for help on using the changeset viewer.
