我找到了解决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。
答案 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)