File: intdgesvd.c

package info (click to toggle)
scilab 2.6-4
  • links: PTS
  • area: non-free
  • in suites: woody
  • size: 54,632 kB
  • ctags: 40,267
  • sloc: ansic: 267,851; fortran: 166,549; sh: 10,005; makefile: 4,119; tcl: 1,070; cpp: 233; csh: 143; asm: 135; perl: 130; java: 39
file content (69 lines) | stat: -rw-r--r-- 1,870 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "stack-c.h"
/*      SUBROUTINE DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
       $                   WORK, LWORK, INFO)   */
 
/*     [U,s,VT]=svd(A)      */
/*     [U,s]=svd(A)         */
/*       s = svd(A)         */

#define MAX(x,y)	(((x)>(y))?(x):(y))
#define MIN(x,y)	(((x)<(y))?(x):(y))

int intdgesvd(fname)
     char* fname;
{ 
  int M,N,lA;
  int NRHS, NLHS;
  int mU, nU, lU, U;
  int mVT, nVT, lVT, VT;
  int ls, ns, s;
  int un=1; int WORK, LWORKMIN, LWORK, lw, INFO;
  int LDA, LDU, LDVT;

  CheckRhs(1,1) ;  CheckLhs(3,3) ;

  /*--------------------A---------------------------*/
  GetRhsVar(1, "d", &M, &N, &lA);

  NRHS=Rhs; NLHS=Lhs;
  switch ( NLHS ) {
  case 3:        /*  [U,s,VT]=svd(A)     */
  /*--------------------U---------------------------*/
    mU=M; nU=M;
    U=NRHS+1;
    CreateVar(U, "d", &mU, &nU, &lU);   /* U */
  /*--------------------s---------------------------*/
    ns=M; if (M>N) ns=N;
    s=NRHS+2;
    CreateVar(s, "d", &un, &ns, &ls);    /* s  */
  /*--------------------VT---------------------------*/
    mVT=N; nVT=N;
    VT=NRHS+3;
    CreateVar(VT, "d", &mVT, &nVT, &lVT);   /* VT */
  /*--------------------WORK---------------------------*/
    WORK=NRHS+4;
    LWORK=Maxvol(WORK, "d");  /*  max memory currently available */
    LWORKMIN = MAX(3*MIN(M,N)+MAX(M,N),5*MIN(M,N)-4);
    if (LWORK < LWORKMIN) { sciprint("not enough memory (use stacksize)");
       Error(9999); };
    CreateVar(NRHS+4, "d", &LWORK, &un, &lw);   /* WORK */
    LDA=M; LDU=M; LDVT=N;

    C2F(dgesvd)("A", "A", &M, &N, stk(lA), &LDA, stk(ls), stk(lU), &LDU, stk(lVT), &LDVT, stk(lw), &LWORK, &INFO);

    LhsVar(1)=U; LhsVar(2)=s; LhsVar(3)=VT;
    break;
  case 2:
    /*   [U,s]=svd(A)  To be done  */
    break;
  case 1:
    /*    s=svd(A) To be done  */
    break;
  default:
    return 0;
 }
  return(0);
}