最佳答案
在对不同大小的方阵进行了一些实验后,形成了一个模式。总是,将大小为__ABC0的矩阵转置比将大小为2^n+1
的矩阵转置要慢。对于n
的小值,差异并不大。
然而,512的值会产生很大的差异。(至少对我来说)
免责声明:我知道这个函数实际上并没有转置矩阵,因为元素的双重交换,但它没有什么区别。
遵循代码:
#define SAMPLES 1000
#define MATSIZE 512
#include <time.h>
#include <iostream>
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,完全优化),差异是类似的:
为什么会这样?