如何将指针指向函数? (SVD示例)

时间:2014-10-27 08:45:28

标签: c double-pointer

我找到了解决SVD的示例代码。 它有这个功能:

int dsvd(float **a, int m, int n, float *w, float **v)

描述:  * dsvd的输入如下:

  • a =要分解的mxn矩阵,被u覆盖

  • m =

  • 的行维度
  • n =

  • 的列维度
  • w =返回

  • 的奇异值向量
  • v =返回正确的正交变换矩阵

让我们想要用矩阵(= a)求解SVD = {1,0,0,0,2,0,0,3,0,0,0,0,0,0,0,0,4,0,0,0};

那么我应该把它放进一个,m,n,w,v ????

我是否必须输入

之类的值
int a1 = 5;
int b1 = 4;
float **a = (float **)malloc(a1*sizeof(float*))
a[0] = (float*)malloc(b1*sizeof(float))
a[1] = (float*)malloc(b1*sizeof(float))
a[2] = (float*)malloc(b1*sizeof(float))
a[3] = (float*)malloc(b1*sizeof(float))
a[0][0] = 1, a[0][4] = 2  ...... 

?????????

即使它是对的(实际上我不这么认为......),但我不知道我需要将哪些值放入* w和** v。

2 个答案:

答案 0 :(得分:0)

我认为你不需要在w和v中加值。它们用于存储返回值。希望以下解决方案能为您提供帮助。

int main(){
int row=3;
int col=2;
float **a = (float **)malloc(row*sizeof(float*));
float *m = (float *)malloc(row*sizeof(float));     /* m is an array of size row*/
float **v = (float **)malloc(row*sizeof(float*));
int i, j;

for (i=0; i < row; i++) {
        a[i] = (float*)malloc(col*sizeof(float));  /* a is row*col */
}   

for (i=0; i < row; i++) {
        v[i] = (float*)malloc(row*sizeof(float));  /* v is a row*row */
}   

for (i=0; i < row; i++) {
    for (j=0; j < col; j++) {
        a[i][j] = i;                               /* you can assign the value you want to a */
    }   
}   
dsvd(a, m, n, w, v); 

}

答案 1 :(得分:0)

更好的事情,

float a[][4] = {{1,0,0,0},{2,0,0,3},{0,0,0,0},{0,0,0,0},{4,0,0,0}};
int m = 5, n = 4;
float *w = malloc(4*sizeof(float));
float **v = malloc (4 * sizeof(float *) + 16 * sizeof(float));
dsvd(a,m,n,w,v);

如果您需要svd进行某些分析(即不进行研究),最好使用其中一个标准LAPACK库或NR代码(http://3map.snu.ac.kr/courses/2005/advance/c2-6.pdf