Я пытаюсь оптимизировать некоторый написанный на С код, который умножает Матрицу на ее транспонирование и хотел бы знать, может ли кто-нибудь увидеть что-нибудь еще, что я могу сделать, чтобы сделать мой метод более эффективным с точки зрения времени / часов вычислений циклы.
Для целей этого примера я бы предпочел не изменять алгоритм, чтобы сделать его более математически эффективным, т. Е. Использовать свойство диагонали при умножении матрицы на ее инверсию.
Я основывал свое решение на некотором примере кода и затем модифицировал его оттуда. До сих пор я осознавал, что могу изменить порядок вычислений в циклах, чтобы избежать ненужных вычислений.
Неизмененный пример кода:
void print_unmodified()
{
unsigned int n = 64;
unsigned int A[N_MAX]; // N_MAX = 64*64
unsigned int B[N_MAX];
// Initialising the A Matrix with values 1->64^2
for (int i = 0; i < (n * n); i++)
{
A[i] = i + 1;
}
// Initialising the B Matrix with zeros
for (int i = 0; i < (n * n); i++)
{
B[i] = 0;
}
// Matrix Multiplicaiton B = A*A'
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
B[i + n * j] = B[i + n * j] + A[i + n * k] * A[j + n * k];
}
}
}
}
Мой модифицированный код:
void print_modified()
{
unsigned int n = 64;
unsigned int A[N_MAX];
unsigned int B[N_MAX];
unsigned int temp = 0;
// Initialising the A Matrix with values 1->64^2
for (int i = 0; i < (n * n); i++)
{
A[i] = i + 1;
}
// Matrix Multiplicaiton B = A*A'
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
temp = 0;
for (int k = 0; k < (n*n); k+=n)
{
temp += A[j + k] * A[i + k];
}
B[j + n*i] = temp;
}
}
}
Оба метода заканчиваются полученной B-матрицей, поэтому я знаю, что мой текущий метод математически корректен.
РЕДАКТИРОВАТЬ: исправлен тип - я не хочу умножать А на его обратное, но умножить А на его транспонирование.