После проведения некоторых экспериментов с квадратными матрицами разных размеров возникла закономерность. Как правило, транспонирование матрицы размера 2^n
происходит медленнее, чем транспонирование матрицы размера2^n+1
. При малых значениях n
разница невелика.
Однако большие различия возникают при значении 512 (, по крайней мере, для меня )
. Отказ от ответственности :Я знаю, что функция на самом деле не транспонирует матрицу из-за двойной замены элементов, но это не имеет значения.
Соответствует коду:
#define SAMPLES 1000
#define MATSIZE 512
#include
#include
int mat[MATSIZE][MATSIZE];
void transpose()
{
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
{
int aux = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = aux;
}
}
int main()
{
//initialize matrix
for ( int i = 0 ; i < MATSIZE ; i++ )
for ( int j = 0 ; j < MATSIZE ; j++ )
mat[i][j] = i+j;
int t = clock();
for ( int i = 0 ; i < SAMPLES ; i++ )
transpose();
int elapsed = clock() - t;
std::cout << "Average for a matrix of " << MATSIZE << ": " << elapsed / SAMPLES;
}
Изменение MATSIZE
позволяет нам изменить размер (. ). Выложил две версии на ideone:
В моей среде (MSVS 2010, полная оптимизация ), разница аналогична:
Почему это происходит?