总和中乘以3个矩阵
我想计算:
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]
等等。
但现在,我对如何应用适当的指数感到困惑。
我希望有人解释我应该如何处理这个问题。
如果我使用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
(或者只是float operator()(int col, int row) const
如果你不关心获取数组条目地址的能力)。