転置行列を作る

転置行列は高校の授業でも習いますが、「m 行n 列の行列 A に対して A の (i, j) 要素と (j, i) 要素を入れ替えた n 行 m 列の行列、つまり対角線で成分を折り返した行列のこと」です。

行列計算に限らず、データの X, Y を反転させたい時に使いたいこともあると思いますが、アルゴリズムとしては非常に簡単なものです。

#! /usr/bin/gawk -f
# transposed_matrix.awk

{
    for (i = 1; i <= NF; i++) {
        val[i, NR] = $i;
    }
}

END {
    for (i = 1; i <= NF; i++) {
        for (j = 1; j <= NR; j++) {
            printf("%s%s", val[i, j], OFS);
        }
        print "";
    }
}

いろいろなデータを用意して試してみてください。 数値のみであれば、sprintf() 関数のフォーマットは '%d' などでも良いかもしれませんが、ここではあえて '%s' にしてあります。

$ cat input.txt
1 2 3
4 5 6
7 8 9

$ nawk -f transposed_matrix.awk input.txt
1 4 7
2 5 8
3 6 9

ただし、awk にはフィールドの制限がありますので、使っている awk によっては大きなデータを処理する際には気をつけてください。

文字列の転置行列 (2009-08-10)

以下のような転置行列のようなものを希望しているとこんなソフト無いですか? in Linux板 (10th) に書かれてありました。

いろは   いにと
にほへ → ろほち
とちり   はへり

AWK Users JP :: 転置行列を作るへのリンクがされてあったので、ここに記載しておきます。

文字単位も同じですが、日本語を扱うためには gawk である必要がありますが、split() で分割することで、上記と同じアルゴリズムがそのまま使えます。

#! /usr/local/bin/gawk -f
# transposed_matrix_2.awk
# 文字列の転置行列を作る
# Ref: http://pc11.2ch.net/test/read.cgi/linux/1231133184/364
# usage: gawk -f transposed_matrix_2.awk file


{
    num_str = split($0, arr_str, "");
    for (i = 1; i <= num_str; i++) {
        val[i, NR] = arr_str[i];
    }
}

END {
    for (i = 1; i <= num_str; i++) {
        for (j = 1; j <= NR; j++) {
            printf("%s", val[i, j]);
        }
        print "";
    }
}

以下のようになります。

$ cat input_2.txt
いろは
にほへ
とちり

$ gawk -f transposed_matrix_2.awk input_2.txt
いにと
ろほち
はへり

内容を把握しておけば、awk の FS による自動分割を split() 関数による分割に置き換えれば良いと分かるでしょう。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png