【问题标题】:How can I put pointer to function? (SVD example)如何将指针指向函数? (SVD 示例)
【发布时间】:2014-10-27 08:45:28
【问题描述】:

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

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

带有描述: * dsvd的输入如下:

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

  • m = a 的行维度

  • n = a 的列维度

  • w = 返回 a 的奇异值向量

  • v = 返回右正交变换矩阵

让我们假设我想用矩阵 (=a) 解决 SVD 是 = {1,0,0,0,2, 0,0,3,0,0, 0,0,0,0,0, 0,4,0,0,0};

那我应该在 a, 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 中输入什么样的值。

【问题讨论】:

标签: c double-pointer


【解决方案1】:

我认为你不需要将值放在 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); 

}

【讨论】:

    【解决方案2】:

    像这样更好,

    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)

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多