Умножение 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
если вам не нужна возможность взять адрес записи массива).