总和中乘以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如果你不关心获取数组条目地址的能力)。