一次总和3个矩阵的乘法

时间:2014-03-04 20:24:12

标签: c numerical

我想计算:

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]等等。

但是现在,我对如何应用适当的指数感到困惑。

我希望有人解释我应该如何处理这个问题。

1 个答案:

答案 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}}如果你不关心获取数组条目地址的能力。)