annotate util/ksvd utils/ompbox utils/myblas.h @ 137:9207d56c5547 ivand_dev

New ompbox in utils for testing purposes
author Ivan Damnjanovic lnx <ivan.damnjanovic@eecs.qmul.ac.uk>
date Thu, 21 Jul 2011 14:07:41 +0100
parents
children
rev   line source
ivan@137 1 /**************************************************************************
ivan@137 2 *
ivan@137 3 * File name: myblas.h
ivan@137 4 *
ivan@137 5 * Ron Rubinstein
ivan@137 6 * Computer Science Department
ivan@137 7 * Technion, Haifa 32000 Israel
ivan@137 8 * ronrubin@cs
ivan@137 9 *
ivan@137 10 * Version: 1.1
ivan@137 11 * Last updated: 17.8.2009
ivan@137 12 *
ivan@137 13 * A collection of basic linear algebra functions, in the spirit of the
ivan@137 14 * BLAS/LAPACK libraries.
ivan@137 15 *
ivan@137 16 *************************************************************************/
ivan@137 17
ivan@137 18
ivan@137 19
ivan@137 20 #ifndef __MY_BLAS_H__
ivan@137 21 #define __MY_BLAS_H__
ivan@137 22
ivan@137 23
ivan@137 24 #include "mex.h"
ivan@137 25 #include <math.h>
ivan@137 26
ivan@137 27
ivan@137 28
ivan@137 29 /**************************************************************************
ivan@137 30 * Squared value.
ivan@137 31 **************************************************************************/
ivan@137 32 #define SQR(X) ((X)*(X))
ivan@137 33
ivan@137 34
ivan@137 35
ivan@137 36 /**************************************************************************
ivan@137 37 * Matrix-vector multiplication.
ivan@137 38 *
ivan@137 39 * Computes an operation of the form:
ivan@137 40 *
ivan@137 41 * y := alpha*A*x
ivan@137 42 *
ivan@137 43 * Parameters:
ivan@137 44 * A - matrix of size n X m
ivan@137 45 * x - vector of length m
ivan@137 46 * y - output vector of length n
ivan@137 47 * alpha - real constant
ivan@137 48 * n, m - dimensions of A
ivan@137 49 *
ivan@137 50 * Note: This function re-writes the contents of y.
ivan@137 51 *
ivan@137 52 **************************************************************************/
ivan@137 53 void mat_vec(double alpha, double A[], double x[], double y[], mwSize n, mwSize m);
ivan@137 54
ivan@137 55
ivan@137 56
ivan@137 57 /**************************************************************************
ivan@137 58 * Matrix-transpose-vector multiplication.
ivan@137 59 *
ivan@137 60 * Computes an operation of the form:
ivan@137 61 *
ivan@137 62 * y := alpha*A'*x
ivan@137 63 *
ivan@137 64 * Parameters:
ivan@137 65 * A - matrix of size n X m
ivan@137 66 * x - vector of length n
ivan@137 67 * y - output vector of length m
ivan@137 68 * alpha - real constant
ivan@137 69 * n, m - dimensions of A
ivan@137 70 *
ivan@137 71 * Note: This function re-writes the contents of y.
ivan@137 72 *
ivan@137 73 **************************************************************************/
ivan@137 74 void matT_vec(double alpha, double A[], double x[], double y[], mwSize n, mwSize m);
ivan@137 75
ivan@137 76
ivan@137 77
ivan@137 78 /**************************************************************************
ivan@137 79 * Sparse-matrix-vector multiplication.
ivan@137 80 *
ivan@137 81 * Computes an operation of the form:
ivan@137 82 *
ivan@137 83 * y := alpha*A*x
ivan@137 84 *
ivan@137 85 * where A is a sparse matrix.
ivan@137 86 *
ivan@137 87 * Parameters:
ivan@137 88 * pr,ir,jc - sparse representation of the matrix A, of size n x m
ivan@137 89 * x - vector of length m
ivan@137 90 * y - output vector of length n
ivan@137 91 * alpha - real constant
ivan@137 92 * n, m - dimensions of A
ivan@137 93 *
ivan@137 94 * Note: This function re-writes the contents of y.
ivan@137 95 *
ivan@137 96 **************************************************************************/
ivan@137 97 void mat_sp_vec(double alpha, double pr[], mwIndex ir[], mwIndex jc[], double x[], double y[], mwSize n, mwSize m);
ivan@137 98
ivan@137 99
ivan@137 100
ivan@137 101 /**************************************************************************
ivan@137 102 * Sparse-matrix-transpose-vector multiplication.
ivan@137 103 *
ivan@137 104 * Computes an operation of the form:
ivan@137 105 *
ivan@137 106 * y := alpha*A'*x
ivan@137 107 *
ivan@137 108 * where A is a sparse matrix.
ivan@137 109 *
ivan@137 110 * Parameters:
ivan@137 111 * pr,ir,jc - sparse representation of the matrix A, of size n x m
ivan@137 112 * x - vector of length m
ivan@137 113 * y - output vector of length n
ivan@137 114 * alpha - real constant
ivan@137 115 * n, m - dimensions of A
ivan@137 116 *
ivan@137 117 * Note: This function re-writes the contents of y.
ivan@137 118 *
ivan@137 119 **************************************************************************/
ivan@137 120 void matT_sp_vec(double alpha, double pr[], mwIndex ir[], mwIndex jc[], double x[], double y[], mwSize n, mwSize m);
ivan@137 121
ivan@137 122
ivan@137 123
ivan@137 124 /**************************************************************************
ivan@137 125 * Matrix-sparse-vector multiplication.
ivan@137 126 *
ivan@137 127 * Computes an operation of the form:
ivan@137 128 *
ivan@137 129 * y := alpha*A*x
ivan@137 130 *
ivan@137 131 * where A is a matrix and x is a sparse vector.
ivan@137 132 *
ivan@137 133 * Parameters:
ivan@137 134 * A - matrix of size n X m
ivan@137 135 * pr,ir,jc - sparse representation of the vector x, of length m
ivan@137 136 * y - output vector of length n
ivan@137 137 * alpha - real constant
ivan@137 138 * n, m - dimensions of A
ivan@137 139 *
ivan@137 140 * Note: This function re-writes the contents of y.
ivan@137 141 *
ivan@137 142 **************************************************************************/
ivan@137 143 void mat_vec_sp(double alpha, double A[], double pr[], mwIndex ir[], mwIndex jc[], double y[], mwSize n, mwSize m);
ivan@137 144
ivan@137 145
ivan@137 146
ivan@137 147 /**************************************************************************
ivan@137 148 * Matrix-transpose-sparse-vector multiplication.
ivan@137 149 *
ivan@137 150 * Computes an operation of the form:
ivan@137 151 *
ivan@137 152 * y := alpha*A'*x
ivan@137 153 *
ivan@137 154 * where A is a matrix and x is a sparse vector.
ivan@137 155 *
ivan@137 156 * Parameters:
ivan@137 157 * A - matrix of size n X m
ivan@137 158 * pr,ir,jc - sparse representation of the vector x, of length n
ivan@137 159 * y - output vector of length m
ivan@137 160 * alpha - real constant
ivan@137 161 * n, m - dimensions of A
ivan@137 162 *
ivan@137 163 * Note: This function re-writes the contents of y.
ivan@137 164 *
ivan@137 165 **************************************************************************/
ivan@137 166 void matT_vec_sp(double alpha, double A[], double pr[], mwIndex ir[], mwIndex jc[], double y[], mwSize n, mwSize m);
ivan@137 167
ivan@137 168
ivan@137 169
ivan@137 170 /**************************************************************************
ivan@137 171 * Sparse-matrix-sparse-vector multiplication.
ivan@137 172 *
ivan@137 173 * Computes an operation of the form:
ivan@137 174 *
ivan@137 175 * y := alpha*A*x
ivan@137 176 *
ivan@137 177 * where A is a sparse matrix and x is a sparse vector.
ivan@137 178 *
ivan@137 179 * Parameters:
ivan@137 180 * pr,ir,jc - sparse representation of the matrix A, of size n x m
ivan@137 181 * prx,irx,jcx - sparse representation of the vector x (of length m)
ivan@137 182 * y - output vector of length n
ivan@137 183 * alpha - real constant
ivan@137 184 * n, m - dimensions of A
ivan@137 185 *
ivan@137 186 * Note: This function re-writes the contents of y.
ivan@137 187 *
ivan@137 188 **************************************************************************/
ivan@137 189 void mat_sp_vec_sp(double alpha, double pr[], mwIndex ir[], mwIndex jc[], double prx[], mwIndex irx[], mwIndex jcx[], double y[], mwSize n, mwSize m);
ivan@137 190
ivan@137 191
ivan@137 192
ivan@137 193 /**************************************************************************
ivan@137 194 * Sparse-matrix-transpose-sparse-vector multiplication.
ivan@137 195 *
ivan@137 196 * Computes an operation of the form:
ivan@137 197 *
ivan@137 198 * y := alpha*A'*x
ivan@137 199 *
ivan@137 200 * where A is a sparse matrix and x is a sparse vector.
ivan@137 201 *
ivan@137 202 * Importnant note: this function is provided for completeness, but is NOT efficient.
ivan@137 203 * If possible, convert x to non-sparse representation and use matT_vec_sp instead.
ivan@137 204 *
ivan@137 205 * Parameters:
ivan@137 206 * pr,ir,jc - sparse representation of the matrix A, of size n x m
ivan@137 207 * prx,irx,jcx - sparse representation of the vector x (of length n)
ivan@137 208 * y - output vector of length n
ivan@137 209 * alpha - real constant
ivan@137 210 * n, m - dimensions of A
ivan@137 211 *
ivan@137 212 * Note: This function re-writes the contents of y.
ivan@137 213 *
ivan@137 214 **************************************************************************/
ivan@137 215 void matT_sp_vec_sp(double alpha, double pr[], mwIndex ir[], mwIndex jc[], double prx[], mwIndex irx[], mwIndex jcx[], double y[], mwSize n, mwSize m);
ivan@137 216
ivan@137 217
ivan@137 218
ivan@137 219 /**************************************************************************
ivan@137 220 * Matrix-matrix multiplication.
ivan@137 221 *
ivan@137 222 * Computes an operation of the form:
ivan@137 223 *
ivan@137 224 * X := alpha*A*B
ivan@137 225 *
ivan@137 226 * Parameters:
ivan@137 227 * A - matrix of size n X m
ivan@137 228 * B - matrix of size m X k
ivan@137 229 * X - output matrix of size n X k
ivan@137 230 * alpha - real constant
ivan@137 231 * n, m, k - dimensions of A, B
ivan@137 232 *
ivan@137 233 * Note: This function re-writes the contents of X.
ivan@137 234 *
ivan@137 235 **************************************************************************/
ivan@137 236 void mat_mat(double alpha, double A[], double B[], double X[], mwSize n, mwSize m, mwSize k);
ivan@137 237
ivan@137 238
ivan@137 239
ivan@137 240 /**************************************************************************
ivan@137 241 * Matrix-transpose-matrix multiplication.
ivan@137 242 *
ivan@137 243 * Computes an operation of the form:
ivan@137 244 *
ivan@137 245 * X := alpha*A*B
ivan@137 246 *
ivan@137 247 * Parameters:
ivan@137 248 * A - matrix of size n X m
ivan@137 249 * B - matrix of size m X k
ivan@137 250 * X - output matrix of size n X k
ivan@137 251 * alpha - real constant
ivan@137 252 * n, m, k - dimensions of A, B
ivan@137 253 *
ivan@137 254 * Note: This function re-writes the contents of X.
ivan@137 255 *
ivan@137 256 **************************************************************************/
ivan@137 257 void matT_mat(double alpha, double A[], double B[], double X[], mwSize n, mwSize m, mwSize k);
ivan@137 258
ivan@137 259
ivan@137 260
ivan@137 261 /**************************************************************************
ivan@137 262 * Tensor-matrix multiplication.
ivan@137 263 *
ivan@137 264 * This function accepts a 3-D tensor A of size n X m X k
ivan@137 265 * and a 2-D matrix B of size l X k.
ivan@137 266 * The function computes the 3-D tensor X of size n X m X l, where
ivan@137 267 *
ivan@137 268 * X(i,j,:) = B*A(i,j,:)
ivan@137 269 *
ivan@137 270 * for all i,j.
ivan@137 271 *
ivan@137 272 * Parameters:
ivan@137 273 * A - tensor of size n X m X k
ivan@137 274 * B - matrix of size l X k
ivan@137 275 * X - output tensor of size n X m X l
ivan@137 276 * alpha - real constant
ivan@137 277 * n, m, k, l - dimensions of A, B
ivan@137 278 *
ivan@137 279 * Note: This function re-writes the contents of X.
ivan@137 280 *
ivan@137 281 **************************************************************************/
ivan@137 282 void tens_mat(double alpha, double A[], double B[], double X[], mwSize n, mwSize m, mwSize k, mwSize l);
ivan@137 283
ivan@137 284
ivan@137 285
ivan@137 286 /**************************************************************************
ivan@137 287 * Tensor-matrix-transpose multiplication.
ivan@137 288 *
ivan@137 289 * This function accepts a 3-D tensor A of size n X m X k
ivan@137 290 * and a 2-D matrix B of size k X l.
ivan@137 291 * The function computes the 3-D tensor X of size n X m X l, where
ivan@137 292 *
ivan@137 293 * X(i,j,:) = B'*A(i,j,:)
ivan@137 294 *
ivan@137 295 * for all i,j.
ivan@137 296 *
ivan@137 297 * Parameters:
ivan@137 298 * A - tensor of size n X m X k
ivan@137 299 * B - matrix of size k X l
ivan@137 300 * X - output tensor of size n X m X l
ivan@137 301 * alpha - real constant
ivan@137 302 * n, m, k, l - dimensions of A, B
ivan@137 303 *
ivan@137 304 * Note: This function re-writes the contents of X.
ivan@137 305 *
ivan@137 306 **************************************************************************/
ivan@137 307 void tens_matT(double alpha, double A[], double B[], double X[], mwSize n, mwSize m, mwSize k, mwSize l);
ivan@137 308
ivan@137 309
ivan@137 310
ivan@137 311 /**************************************************************************
ivan@137 312 * Vector-vector sum.
ivan@137 313 *
ivan@137 314 * Computes an operation of the form:
ivan@137 315 *
ivan@137 316 * y := alpha*x + y
ivan@137 317 *
ivan@137 318 * Parameters:
ivan@137 319 * x - vector of length n
ivan@137 320 * y - output vector of length n
ivan@137 321 * alpha - real constant
ivan@137 322 * n - length of x,y
ivan@137 323 *
ivan@137 324 * Note: This function re-writes the contents of y.
ivan@137 325 *
ivan@137 326 **************************************************************************/
ivan@137 327 void vec_sum(double alpha, double x[], double y[], mwSize n);
ivan@137 328
ivan@137 329 /**************************************************************************
ivan@137 330 * Vector-vector scalar multiply.
ivan@137 331 *
ivan@137 332 * Computes an operation of the form:
ivan@137 333 *
ivan@137 334 * y := alpha* x.*y
ivan@137 335 *
ivan@137 336 * Parameters:
ivan@137 337 * x - vector of length n
ivan@137 338 * y - output vector of length n
ivan@137 339 * alpha - real constant
ivan@137 340 * n - length of x,y
ivan@137 341 *
ivan@137 342 * Note: This function re-writes the contents of y.
ivan@137 343 *
ivan@137 344 **************************************************************************/
ivan@137 345
ivan@137 346
ivan@137 347 void vec_smult(double alpha, double x[], double y[], mwSize n);
ivan@137 348
ivan@137 349
ivan@137 350 /**************************************************************************
ivan@137 351 * Triangular back substitution.
ivan@137 352 *
ivan@137 353 * Solve the set of linear equations
ivan@137 354 *
ivan@137 355 * T*x = b
ivan@137 356 *
ivan@137 357 * where T is lower or upper triangular.
ivan@137 358 *
ivan@137 359 * Parameters:
ivan@137 360 * ul - 'U' for upper triangular, 'L' for lower triangular
ivan@137 361 * A - matrix of size n x m containing T
ivan@137 362 * b - vector of length k
ivan@137 363 * x - output vector of length k
ivan@137 364 * n - size of first dimension of A
ivan@137 365 * k - the size of the equation set, k<=n,m
ivan@137 366 *
ivan@137 367 * Note:
ivan@137 368 * The matrix A can be of any size n X m, as long as n,m >= k.
ivan@137 369 * Only the lower/upper triangle of the submatrix A(1:k,1:k) defines the
ivan@137 370 * matrix T (depending on the parameter ul).
ivan@137 371 *
ivan@137 372 **************************************************************************/
ivan@137 373 void backsubst(char ul, double A[], double b[], double x[], mwSize n, mwSize k);
ivan@137 374
ivan@137 375
ivan@137 376
ivan@137 377 /**************************************************************************
ivan@137 378 * Solve a set of equations using a Cholesky decomposition.
ivan@137 379 *
ivan@137 380 * Solve the set of linear equations
ivan@137 381 *
ivan@137 382 * M*x = b
ivan@137 383 *
ivan@137 384 * where M is positive definite with a known Cholesky decomposition:
ivan@137 385 * either M=L*L' (L lower triangular) or M=U'*U (U upper triangular).
ivan@137 386 *
ivan@137 387 * Parameters:
ivan@137 388 * ul - 'U' for upper triangular, 'L' for lower triangular decomposition
ivan@137 389 * A - matrix of size n x m with the Cholesky decomposition of M
ivan@137 390 * b - vector of length k
ivan@137 391 * x - output vector of length k
ivan@137 392 * n - size of first dimension of A
ivan@137 393 * k - the size of the equation set, k<=n,m
ivan@137 394 *
ivan@137 395 * Note:
ivan@137 396 * The matrix A can be of any size n X m, as long as n,m >= k.
ivan@137 397 * Only the lower/upper triangle of the submatrix A(1:k,1:k) is used as
ivan@137 398 * the Cholesky decomposition of M (depending on the parameter ul).
ivan@137 399 *
ivan@137 400 **************************************************************************/
ivan@137 401 void cholsolve(char ul, double A[], double b[], double x[], mwSize n, mwSize k);
ivan@137 402
ivan@137 403
ivan@137 404
ivan@137 405 /**************************************************************************
ivan@137 406 * Maximum absolute value.
ivan@137 407 *
ivan@137 408 * Returns the index of the coefficient with maximal absolute value in a vector.
ivan@137 409 *
ivan@137 410 * Parameters:
ivan@137 411 * x - vector of length n
ivan@137 412 * n - length of x
ivan@137 413 *
ivan@137 414 **************************************************************************/
ivan@137 415 mwIndex maxabs(double x[], mwSize n);
ivan@137 416
ivan@137 417
ivan@137 418
ivan@137 419 /**************************************************************************
ivan@137 420 * Maximum vector element.
ivan@137 421 *
ivan@137 422 * Returns the index of the maximal coefficient in a vector.
ivan@137 423 *
ivan@137 424 * Parameters:
ivan@137 425 * x - vector of length n
ivan@137 426 * n - length of x
ivan@137 427 *
ivan@137 428 **************************************************************************/
ivan@137 429 mwIndex maxpos(double x[], mwSize n);
ivan@137 430
ivan@137 431
ivan@137 432
ivan@137 433 /**************************************************************************
ivan@137 434 * Vector-vector dot product.
ivan@137 435 *
ivan@137 436 * Computes an operation of the form:
ivan@137 437 *
ivan@137 438 * c = a'*b
ivan@137 439 *
ivan@137 440 * Parameters:
ivan@137 441 * a, b - vectors of length n
ivan@137 442 * n - length of a,b
ivan@137 443 *
ivan@137 444 * Returns: The dot product c.
ivan@137 445 *
ivan@137 446 **************************************************************************/
ivan@137 447 double dotprod(double a[], double b[], mwSize n);
ivan@137 448
ivan@137 449
ivan@137 450
ivan@137 451 /**************************************************************************
ivan@137 452 * Indexed vector assignment.
ivan@137 453 *
ivan@137 454 * Perform a permutation assignment of the form
ivan@137 455 *
ivan@137 456 * y = x(ind)
ivan@137 457 *
ivan@137 458 * where ind is an array of indices to x.
ivan@137 459 *
ivan@137 460 * Parameters:
ivan@137 461 * y - output vector of length k
ivan@137 462 * x - input vector of arbitrary length
ivan@137 463 * ind - array of indices into x (indices begin at 0)
ivan@137 464 * k - length of the array ind
ivan@137 465 *
ivan@137 466 **************************************************************************/
ivan@137 467 void vec_assign(double y[], double x[], mwIndex ind[], mwSize k);
ivan@137 468
ivan@137 469
ivan@137 470
ivan@137 471 /**************************************************************************
ivan@137 472 * Matrix transpose.
ivan@137 473 *
ivan@137 474 * Computes Y := X'
ivan@137 475 *
ivan@137 476 * Parameters:
ivan@137 477 * X - input matrix of size n X m
ivan@137 478 * Y - output matrix of size m X n
ivan@137 479 * n, m - dimensions of X
ivan@137 480 *
ivan@137 481 **************************************************************************/
ivan@137 482 void transpose(double X[], double Y[], mwSize n, mwSize m);
ivan@137 483
ivan@137 484
ivan@137 485
ivan@137 486 /**************************************************************************
ivan@137 487 * Print a matrix.
ivan@137 488 *
ivan@137 489 * Parameters:
ivan@137 490 * A - matrix of size n X m
ivan@137 491 * n, m - dimensions of A
ivan@137 492 * matname - name of matrix to display
ivan@137 493 *
ivan@137 494 **************************************************************************/
ivan@137 495 void printmat(double A[], int n, int m, char* matname);
ivan@137 496
ivan@137 497
ivan@137 498
ivan@137 499 /**************************************************************************
ivan@137 500 * Print a sparse matrix.
ivan@137 501 *
ivan@137 502 * Parameters:
ivan@137 503 * A - sparse matrix of type double
ivan@137 504 * matname - name of matrix to display
ivan@137 505 *
ivan@137 506 **************************************************************************/
ivan@137 507 void printspmat(mxArray *A, char* matname);
ivan@137 508
ivan@137 509
ivan@137 510 #endif
ivan@137 511