所定の位置に転置する簡単な方法は、マトリックスの背面から開始して各要素を所定の位置に回転させることです。一度に1つの要素を所定の位置に回転させるだけでよいので、たとえば、で始まると[0,1,2,3,4,5,6,7,8,9,a,b]
、次のようになります。
0,1,2,3,4,5,6,7,8,9,a,b, // step 0
,b, // step 1
,8,9,a,7, // step 2
4,5,6,8,9,a,3, // step 3
,a, // step 4
,8,9,6, // step 5
,4,5,8,9,2, // step 6
,9, // step 7
,8,5, // step 8
,4,8,1, // step 9
,8, // step 10
,4, // step 11
0, // step 12
(これは、各ステップで要素が最終位置に回転したことを示しています。)
各要素に対して(後ろから前に)回転する要素の数を書き出すと、それは素晴らしい進行を形成します。例(width= 4
、height= 3
)の場合:
1,4,7,1,3,5,1,2,3,1,1,1
または、少し構造化された方法で:
1,4,7,
1,3,5,
1,2,3,
1,1,1
1つの要素のローテーションは事実上何も実行されませんが、進行は非常に単純なアルゴリズム(C ++)につながります。
void transpose(int *matrix, int width, int height)
{
int count= width*height;
for (int x= 0; x<width; ++x)
{
int count_adjustment= width - x - 1;
for (int y= 0, step= 1; y<height; ++y, step+= count_adjustment)
{
int last= count - (y+x*height);
int first= last - step;
std::rotate(matrix + first, matrix + first + 1, matrix + last);
}
}
}