我想计算:
result = SUM (c=0,N) { V_ck * U_lc * S_c }
但是我的2D矩阵被索引为1D并存储为专业列。
我在尝试:
float *A,*B;
int M,N;
A = (float *) malloc( M * N * sizeof(float) );
B = (float *) malloc( M * sizeof(float) );
float *S = (float *)malloc( N * sizeof( float) );
float *U = (float *)malloc( M * M * sizeof( float) );
float *V = (float *)malloc( N * N * sizeof( float) );
float * result = (float *) malloc( M * N * sizeof(float) );
float thesum=0;
for (int k=0; k < M ; k++) {
for (int l=0 ; l < N; l++) {
for ( int c=0; c < N; c++) {
thesum += V[ k+c*N ] * S[c] * U[l*M + k];
result[ k+l*M ]=thesum;
}
}
}
我有一个大错误,我想在上面,因为我需要另一个循环?为了正确地进行乘法,然后使用:
for ( int c=0; c < N; c++)
求和的循环,对吧?
然后,我是否必须创建一个包含乘法值的数组,然后使用此数组来保存求和值?
如果我使用2D表示法,我会简单地使用U[l][k]
等等。
但是现在,我对如何应用适当的指数感到困惑。
我希望有人解释我应该如何处理这个问题。
答案 0 :(得分:1)
如果我使用2D符号,我会简单地使用U [l] [k]等等。
所以,添加那个抽象层 - 不要让其他一切变得复杂。你有:
A = (float *) malloc( M * N * sizeof(float) );
至少,你可以使用:
float& at(float* p, int rows, int col, int row) { return p[rows * col + row]; }
(重新排序品味参数)
然后你可以说:
at(A, M, col, row)
(或者类似 - 我不会发誓我把所有的行/列名称都正确 - 但恕我直言你应该使用行和列而不是M和N所以我不会破坏它的直觉。)
如果你想获得一点点发烧友,你可以在C ++中将分配包装在一个存储指针和#rows / columns的类中,然后重载float& operator()(int col, int row)
和const float& operator()(int col, int row) const
(或只是{{ 1}}如果你不关心获取数组条目地址的能力。)