1

我找到了一个解决 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 中输入什么样的值。

4

2 回答 2

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 )

于 2014-10-27T11:05:54.040 回答
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); 

}
于 2014-10-27T10:22:06.010 回答