2016-06-21 10 views
3

を転置されてどのようにコードの下に理解しようとしています行のx COLトランスポーズ:このコードは行列

int transpose(int* a, int row, int col) 
{ 
    for(int i = 0; i < row*col; i++) 
    { 
     int old = i; 
     do 
     { 
      old = (old%row)*col + old/row; 
     } 
     while(old < i) 
     swap(a[i],a[old]) 
    } 
} 

に行列を転置このライン(old = (old%row)*col + old/row)は何をしているのですか?

+0

外側のループは、明らかに行列のすべての要素を反復処理します。ただし、すべての要素がパートナーと交換されるわけではありません。私はこれを理解するのが少し難しいと思う。明らかに、 'old'の値は' while'ループが繰り返すにつれて変更できません。 – Codor

+1

次の順列サイクルです。こちらをご覧ください:https://en.wikipedia.org/wiki/In-place_matrix_transposition – samgak

+0

最初と最後の要素はその位置に残ります。他の要素は交換されます。私が今まで理解してきたのは、すべての要素に対して、私たちは古い位置を見つけようとしています。 – Bhuwan

答えて

0

マトリックスは、サイズrow*colの1次元配列で格納されます。配列インデックスはi=r*col+cであり、cが現在の列で、rが現在の行であるとします。インデックスから行を計算するには、整数の除算r=i/colを使用して列インデックスを取得し、剰余c=i%colを使用します。

引用符で囲まれた行では、oldが配列インデックスです。上記のように除算と剰余がcolで計算されるのではなく、rowであるため、この文は転置された要素の新しいインデックスを計算します。

do whileループは、要素が2回スワップされないようにします。しかし、私はそれを理解するのが難しく、これを行うためのより良い方法があるはずであると信じています。

+0

より良い(おそらくもっと速い)方法が存在しますが、すでにスワップされた要素インデックスを格納するためのメモリが必要です。 https://en.wikipedia.org/wiki/In-place_matrix_transposition – MBo

関連する問題