Mengurangi Bentuk Eselon Baris dari Matriks

8

Tujuan dari tantangan ini adalah untuk membuat program yang mengambil dalam matriks dan output bentuk eselon baris berkurang.

Matriks dalam bentuk eselon baris tereduksi jika memenuhi semua kondisi berikut:

  1. Jika ada baris di mana setiap entri adalah nol, maka baris ini terletak di bawah baris lain yang berisi entri bukan nol.
  2. Entri bukan nol paling kiri dari sebuah baris sama dengan 1.
  3. Entri bukan nol paling kiri dari satu baris adalah satu-satunya entri bukan nol di kolomnya.
  4. Pertimbangkan dua entri bukan nol paling kiri yang berbeda, satu terletak di baris i, kolom j dan yang lainnya terletak di baris s, kolom t. Jika s>idemikian t>j.

Sumber

Proses umum untuk mengubah matriks adalah:

  1. Berurusan dengan setiap baris i dari 1 sampai n secara bergantian, dan bekerja melintasi kolom j dari 1 hingga m melewatkan kolom dari semua entri nol.
  2. Temukan kolom berikutnya j dengan entri bukan nol.
  3. Baris pertukaran, jika perlu, sehingga elemen pivot A (i, j) adalah nol.
  4. Buat pivot sama dengan 1 dengan membagi setiap elemen dalam baris pivot dengan nilai pivot.
  5. Buat semua elemen di atas dan di bawah pivot sama dengan 0 dengan mengurangi kelipatan baris pivot yang cocok dari setiap baris lainnya.
  6. Ulangi untuk semua baris.

Jika Anda ingin membaca lebih lanjut tentang jenis matriks ini, lihat artikel Wikipedia di atasnya dan alat dan artikel (langkah-langkah di atas) yang menunjukkan langkah-langkah untuk mengubah matriks.

Adapun tantangan yang sebenarnya, ini dia:

Masukan dapat diberikan dengan cara apa pun yang Anda inginkan melalui STDIN atau yang setara, cukup jelaskan dalam jawaban Anda. Output akan berupa bentuk eselon baris tereduksi dari input dalam bentuk yang sama dengan input melalui STDOUT atau yang setara. Celah standar tidak diperbolehkan dan perpustakaan eksternal atau fungsi yang melakukan tugas ini juga tidak diperbolehkan ( TI-BASIC's rref(perintah, misalnya). Anda dapat menulis program atau fungsi lengkap. Ini adalah kode golf, kemenangan BYTES terendah. Semoga berhasil!

Input Contoh: [[2,1,1,14][-1,-3,2,-2][4,-6,3,-5]]

Contoh Output: [[1,0,0,1][0,1,0,5][0,0,1,7]]

GamrCorps
sumber
5
Anda perlu memberikan beberapa penjelasan tentang proses reduksi di sini, jadi pertanyaan ini masih masuk akal ketika link tersebut pergi buruk.
Sparr
Menambahkan penjelasan. Semoga cukup detail.
GamrCorps
Apakah kita diperbolehkan menggunakan `ref ()` `, pemecah persamaan linier, atau bawaan lain yang hampir menyelesaikan masalah?
lirtosiast
Selama ada langkah yang lebih kompleks yang hanya seperti method(ref(matrix)), maka saya akan katakan maju
GamrCorps

Jawaban:

2

R, 232 byte

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}

Ini hanyalah implementasi dari algoritma eliminasi Gaussian yang biasa.

Tidak Disatukan:

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
}
Alex A.
sumber
Saya pikir Anda mungkin bisa lolos M[c(i,r),]=M[c(r,i),]daripadat=M[i,];M[i,]=M[r,];M[r,]=t
MickyT