行列の縮約行エシェロン形式


8

この課題の目標は、行列を取り込んで行数を減らした形で出力するプログラムを作成することです。

マトリックスは、次のすべての条件を満たす場合、簡約行の形になります。

  1. すべてのエントリがゼロである行がある場合、この行はゼロ以外のエントリを含む他の行の下にあります。
  2. 行の左端のゼロ以外のエントリはに等しくなり1ます。
  3. 行の左端のゼロ以外のエントリは、その列の唯一のゼロ以外のエントリです。
  4. 左端のゼロ以外の2つの異なるエントリを考えます。1つは行i、j列にあり、もう1つは行s、t列にあります。もしs>i、その後、 t>j

ソース

マトリックスを変換する一般的なプロセスは次のとおりです。

  1. 1からnまでの各行iを順番に処理し、すべてのゼロエントリの列をスキップして、1からmまでの列jにわたって作業します。
  2. ゼロ以外のエントリを持つ次の列jを見つけます。
  3. 必要に応じて行を交換し、ピボット要素A(i、j)が非ゼロになるようにします。
  4. ピボット行の各要素をピボットの値で除算して、ピボットを1に等しくします。
  5. ピボット行の適切な倍数を他の行から減算して、ピボットの上下のすべての要素を0に等しくします。
  6. すべての行について繰り返します。

このタイプのマトリックスの詳細を読みたい場合は、そのWikipediaの記事と、マトリックスを変換する手順を示すツール記事(上記の手順)をご覧ください。

実際の課題については、次のとおりです。

入力は、STDINまたは同等のものを使用して任意の方法で指定できます。回答で説明してください。出力は、STDOUTまたは同等のものを介した入力と同じ形式の、入力の簡略化された行エシェロン形式になります。標準の抜け穴は許可されておらず、このタスクを実行する外部ライブラリまたは関数(たとえば、TI-BASICrref(コマンド)も許可されていません。完全なプログラムまたは関数を記述できます。これはコードゴルフで、最低のBYTES勝です。幸運を!

入力例: [[2,1,1,14][-1,-3,2,-2][4,-6,3,-5]]

出力例: [[1,0,0,1][0,1,0,5][0,0,1,7]]


5
あなたは与える必要があり、いくつかのこれらのリンクが悪い行くときこの質問はまだ理にかなっているので、ここでの還元プロセスの説明を。
Sparr

説明を追加しました。その十分に詳細を願っています。
GamrCorps、2015年

`ref()` `、線形方程式ソルバー、または問題をほぼ解決する他の組み込み関数を使用することは許可されていますか?
リルトシアスト2015年

限りのようなだけで何かをすることを、より複雑なステップがあるのでmethod(ref(matrix))、私は先に行くと言うでしょう
GamrCorps

回答:


2

R、232バイト

function(M){p=1;R=nrow(M);C=ncol(M);for(r in 1:R){if(C<=p)break;i=r;while(M[i,p]==0){i=i+1;if(R==i){i=r;p=p+1;if(C==p)return(M)}};t=M[i,];M[i,]=M[r,];M[r,]=t;M[r,]=M[r,]/M[r,p];for(i in 1:R)if(i!=r)M[i,]=M[i,]-M[r,]*M[i,p];p=p+1};M}

これは、通常のガウスの消去アルゴリズムの単なる実装です。

未ゴルフ:

rref <- function(M) {
    p <- 1
    R <- nrow(M)
    C <- ncol(M)
    for (r in 1:R) {
        if (C <= p)
            break
        i <- r
        while (M[i, p] == 0) {
            i <- i + 1
            if (R == i) {
                i <- r
                p <- p + 1
                if (C == p)
                    return(M)
            }
        }
        t <- M[i, ]
        M[i, ] <- M[r, ]
        M[r, ] <- t
        M[r, ] <- M[r, ] / M[r, p]
        for (i in 1:R)
            if (i != r)
                M[i, ] <- M[i, ] - M[r, ] * M[i, p]
        p <- p + 1
    }
    M
}

私はあなたが離れて得ることができるかもしれないと思うM[c(i,r),]=M[c(r,i),]のではなくt=M[i,];M[i,]=M[r,];M[r,]=t
MickyT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.