Умножение 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] и так далее.

Но сейчас я запутался в том, как применять соответствующие показатели.

И я хочу, чтобы кто-то объяснил мне, как мне поступить с этим.

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++ вы можете обернуть выделения в класс, который хранит указатель и # строки / столбцы, а затем перегружает float& operator()(int col, int row) а также const float& operator()(int col, int row) const (или просто float operator()(int col, int row) const если вам не нужна возможность взять адрес записи массива).

Другие вопросы по тегам