Hình thức giảm hàng Row-Echelon của ma trận


8

Mục tiêu của thử thách này là tạo ra một chương trình lấy ma trận và xuất ra dạng phản hồi hàng giảm.

Một ma trận ở dạng giảm âm hàng nếu nó đáp ứng tất cả các điều kiện sau:

  1. Nếu có một hàng trong đó mọi mục nhập đều bằng 0, thì hàng này nằm bên dưới bất kỳ hàng nào khác có chứa một mục nhập khác.
  2. Các mục khác không ngoài cùng bên trái của một hàng bằng 1.
  3. Mục nhập khác không ngoài cùng của một hàng là mục nhập khác không duy nhất trong cột của nó.
  4. Xem xét bất kỳ hai mục nhập khác không ngoài cùng bên trái, một mục nằm ở hàng i, cột j và mục khác nằm ở hàng s, cột t. Nếu s>i, sau đó t>j.

Nguồn

Quá trình chung để biến đổi ma trận là:

  1. Xử lý lần lượt từng hàng i từ 1 đến n và làm việc trên các cột j từ 1 đến m bỏ qua bất kỳ cột nào trong tất cả các mục nhập không.
  2. Tìm cột j tiếp theo với một mục khác.
  3. Các hàng trao đổi, nếu cần, sao cho phần tử trục A (i, j) là khác không.
  4. Đặt trục bằng 1 bằng cách chia mỗi phần tử trong hàng trục cho giá trị của trục.
  5. Đặt tất cả các yếu tố trên và dưới trục bằng 0 bằng cách trừ một bội số phù hợp của hàng trục khỏi mỗi hàng khác.
  6. Lặp lại cho tất cả các hàng.

Nếu bạn muốn đọc thêm về loại ma trận này, hãy xem bài viết Wikipedia về nó và một công cụbài viết (các bước ở trên) cho thấy các bước để chuyển đổi ma trận.

Đối với thử thách thực tế, ở đây nó đi:

Đầu vào có thể được cung cấp theo bất kỳ cách nào bạn muốn thông qua STDIN hoặc tương đương, chỉ cần vui lòng giải thích nó trong câu trả lời của bạn. Đầu ra sẽ là dạng hồi âm hàng giảm của đầu vào ở dạng tương tự như đầu vào thông qua STDOUT hoặc tương đương. Sơ hở tiêu chuẩn không được phép và thư viện bên ngoài hoặc các chức năng mà làm nhiệm vụ này cũng không được phép ( TI-BASIC's rref(lệnh, ví dụ). Bạn có thể viết một chương trình hoặc chức năng đầy đủ. Đây là mã golf, BYTES thấp nhất sẽ thắng. Chúc may mắn!

Ví dụ đầu vào: [[2,1,1,14][-1,-3,2,-2][4,-6,3,-5]]

Kết quả ví dụ: [[1,0,0,1][0,1,0,5][0,0,1,7]]


5
Bạn cần đưa ra một số lời giải thích về quá trình giảm ở đây, vì vậy câu hỏi này vẫn có ý nghĩa khi các liên kết đó trở nên tồi tệ.
Sparr

Đã thêm một lời giải thích. Hy vọng nó đủ chi tiết.
GamrCorps

Chúng ta có được phép sử dụng `ref ()` `, bộ giải phương trình tuyến tính hoặc bất kỳ nội dung nào khác gần như giải quyết được vấn đề không?
lirtosiast

Miễn là có một bước phức tạp hơn giống như vậy method(ref(matrix)), thì tôi sẽ nói tiếp tục
GamrCorps

Câu trả lời:


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}

Đây chỉ là một triển khai của thuật toán loại bỏ Gaussian thông thường.

Ung dung:

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
}

Tôi nghĩ rằng bạn có thể thoát khỏi M[c(i,r),]=M[c(r,i),]chứ không phảit=M[i,];M[i,]=M[r,];M[r,]=t
MickyT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.