Ma trận đồng sáng lập


18

Ma trận đồng yếu tố là sự hoán vị của Ma trận điều chỉnh . Các yếu tố của ma trận này là các đồng yếu tố của ma trận gốc.

Đồng yếu tố nhập mô tả hình ảnh ở đây(tức là phần tử của ma trận đồng yếu tố ở hàng i và cột j) là yếu tố quyết định của hàm con được hình thành bằng cách xóa hàng thứ i và cột thứ j khỏi ma trận gốc, nhân với (-1) ^ (i + j).

Ví dụ: đối với ma trận

nhập mô tả hình ảnh ở đây

Phần tử của ma trận đồng yếu ở hàng 1 và cột 2 là:

nhập mô tả hình ảnh ở đây

Bạn có thể tìm thấy thông tin về yếu tố quyết định của ma trận và cách tính toán chúng ở đây .

Thử thách

Mục tiêu của bạn là xuất ra ma trận đồng yếu tố của một ma trận đầu vào.

Lưu ý : Được xây dựng để đánh giá ma trận đồng yếu tố hoặc điều chỉnh ma trận hoặc xác định hoặc bất cứ điều gì tương tự đều được cho phép .

Đầu vào

Ma trận có thể được nhập vào dưới dạng đối số dòng lệnh, dưới dạng tham số hàm, theo STDINhoặc theo bất kỳ cách nào phù hợp nhất với ngôn ngữ bạn sử dụng.

Ma trận sẽ được định dạng dưới dạng một danh sách các danh sách, mỗi danh sách con tương ứng với một hàng, chứa các yếu tố được sắp xếp từ trái sang phải. Hàng được sắp xếp từ trên xuống dưới trong danh sách.

Ví dụ: ma trận

a b
c d

sẽ được đại diện bởi [[a,b],[c,d]].

Bạn có thể thay thế dấu ngoặc vuông và dấu phẩy bằng thứ khác nếu nó phù hợp với ngôn ngữ của bạn và hợp lý (ví dụ ((a;b);(c;d)))

Ma trận sẽ chỉ chứa các số nguyên (có thể âm) .

Ma trận sẽ luôn là hình vuông (tức là cùng số lượng hàng và cột).

Bạn có thể cho rằng đầu vào sẽ luôn chính xác (nghĩa là không có vấn đề định dạng, không có gì ngoài số nguyên, không có ma trận trống).

Đầu ra

Ma trận cofactor kết quả có thể được xuất ra STDOUT, được trả về từ một hàm, được ghi vào một tệp hoặc bất cứ thứ gì tương tự tự nhiên phù hợp với ngôn ngữ bạn sử dụng.

Ma trận cofactor phải được định dạng theo cùng một cách chính xác các ma trận đầu vào được đưa ra, ví dụ [[d,-c],[-b,a]]. Nếu bạn đọc một chuỗi, thì bạn phải trả về / xuất ra một chuỗi trong đó ma trận được định dạng chính xác như trong đầu vào. Nếu bạn sử dụng một cái gì đó như ví dụ như một danh sách các danh sách làm đầu vào, thì bạn cũng phải trả về một danh sách các danh sách.

Các trường hợp thử nghiệm

  • Đầu vào: [[1]]

Đầu ra: [[1]]

  • Đầu vào: [[1,2],[3,4]]

Đầu ra: [[4,-3],[-2,1]]

  • Đầu vào: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

Đầu ra: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • Đầu vào: [[3,-2,7,5,0],[1,-1,42,12,-10],[7,7,7,7,7],[1,2,3,4,5],[-3,14,-1,5,-9]]

Đầu ra:

[[9044,-13580,-9709,23982,-9737],[-1981,1330,3689,-3444,406],[14727,7113,2715,-9792,414],[-28448,-2674,-707,16989,14840],[-2149,2569,-2380,5649,-3689]]

Chấm điểm

Đây là vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


2
Tôi không chắc làm thế nào để giải thích ma trận cofactor phải được định dạng chính xác giống như cách các ma trận đầu vào được đưa ra cho các đệ trình hàm nhận đầu vào từ các đối số và trả về một giá trị. Chúng ta có đọc / trả về ma trận thực tế hoặc biểu diễn chuỗi của chúng không?
Dennis

1
Tóm lại: nếu bạn đọc một chuỗi, thì bạn phải trả về / xuất ra một chuỗi trong đó ma trận được định dạng chính xác như trong đầu vào. Nếu bạn sử dụng một cái gì đó như ví dụ như một danh sách các danh sách, thì bạn cũng phải trả về một danh sách các danh sách.
Gây tử vong

Ma trận 1x1 có thực sự có ma trận đồng yếu tố không?
Liam

Ngoài ra trường hợp kiểm tra áp chót của bạn dường như là ma trận liên hợp (hoán vị của những gì nó nên được), trừ khi tôi nhầm.
Liam

@ICanHazHats Đúng, tôi đã sửa nó, cảm ơn.
Gây tử vong

Câu trả lời:


1

J, 29 byte

3 :'<.0.5+|:(-/ .**%.)1e_9+y'

Cùng một thủ thuật epsilon / nghịch đảo / xác định. Từ phải qua trái:

  • 1e_9+ thêm một epsilon,
  • (-/ .**%.)định thức ( -/ .*) lần nghịch đảo ( %.),
  • |: chuyển đổi,
  • <.0.5+ vòng.

5

Matlab, 42 33 byte

Sử dụng chức năng ẩn danh:

@(A)round(inv(A+eps)'*det(A+eps))

Đầu vào và đầu ra là ma trận (mảng số 2D).

epsđược thêm vào trong trường hợp ma trận là số ít. Nó được "loại bỏ" bằng cách sử dụng round(kết quả thực được đảm bảo là một số nguyên).

Thí dụ:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)'*det(A+eps))
>> ans([-3,2,-5; -1,0,-2; 3,-4,1])
ans =
-8    -5     4
18    12    -6
-4    -1     2

Ví dụ với ma trận số ít:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)*det(A+eps)')
>> ans([1,0 ; 0,0])
ans =
     0     0
     0     1

Hoặc thử trực tuyến trong Octave.


2
Tuy nhiên, tôi có một mối quan tâm mà tôi chưa nói đến trong thử thách: câu trả lời này giả định rằng ma trận đầu vào là không thể đảo ngược. Việc sử dụng mã của bạn nói [1,0 ; 0,0]sẽ gây ra lỗi khi nó xuất ra[0,0 ; 0,1]
Fatalize

1
Vì bạn đang quay trở lại từ một hàm, tôi không nghĩ bạn nên cần mat2str: "kết quả là ma trận đồng yếu tố có thể ... được trả về từ một hàm"
FryAmTheEggman

1
@FryAmTheEggman Cảm ơn! Nhưng " Ma trận đồng yếu tố phải được định dạng theo cách chính xác giống như các ma trận đầu vào được đưa ra ". Đó là lý do tại sao tôi nghĩ rằng tôi cầnmat2str
Luis Mendo

1
@Firthize Vâng, đúng vậy. epskhoảng 1e-16. Vì vậy, nó làm cho ma trận không đơn (nhưng rất không điều hòa). Kết quả không chính xác là số nguyên; vì vậy fix(tròn về không) sửa lỗi đó. Công việc này cung cấp lỗi không vượt quá .5. Tôi sợ không có gì đảm bảo. Đối với số nguyên rất lớn, nó có thể thất bại. Tôi nói đó là một mánh khóe bẩn thỉu :-P
Luis Mendo

1
@Firthize cho rõ ràng, bạn có thể nói liệu mat2strcó cần thiết ở đây không? Đối với tôi cảm giác như đây là một hàm, đầu vào thực sự là ma trận không được định dạng. Giống như nếu bạn cố gắng f=...thì làm f(f(...))điều này sẽ không hiệu quả, nhưng loại bỏ mat2strlàm cho nó hoạt động tốt.
FryAmTheEggman

4

Toán học, 27 35 byte

Thread[Det[#+x]Inverse[#+x]]/.x->0&

Điều này có làm việc cho ma trận không khả nghịch, ví dụ [[1,0],[0,0]]?
Gây tử vong

@FryAmTheEggman Điều đó dường như không hoạt động.
LegionMammal978

3

R, 121 94 byte

function(A)t(outer(1:(n=NROW(A)),1:n,Vectorize(function(i,j)(-1)^(i+j)*det(A[-i,-j,drop=F]))))

Đây là một hàm dài vô lý chấp nhận một đối tượng của lớp matrixvà trả về một đối tượng khác như vậy. Để gọi nó, gán nó cho một biến.

Ung dung:

cofactor <- function(A) {
    # Get the number of rows (and columns, since A is guaranteed to
    # be square) of the input matrix A
    n <- NROW(A)

    # Define a function that accepts two indices i,j and returns the
    # i,j cofactor
    C <- function(i, j) {
        # Since R loves to drop things into lower dimensions whenever
        # possible, ensure that the minor obtained by column deletion
        # is still a matrix object by adding the drop = FALSE option
        a <- A[-i, -j, drop = FALSE]

        (-1)^(i+j) * det(a)
    }

    # Obtain the adjugate matrix by vectorizing the function C over
    # the indices of A
    adj <- outer(1:n, 1:n, Vectorize(C))

    # Transpose to obtain the cofactor matrix
    t(adj)
}

80 byte sử dụng mapplythay vì outerVectorize
Giuseppe

2

GAP , 246 byte

Bạn có thể nói đây là mã hóa tốt bởi các vòng lặp for lồng nhau.

Nó khá đơn giản. GAP không thực sự có cùng các công cụ để xử lý ma trận mà các ngôn ngữ định hướng toán học khác làm. Điều duy nhất thực sự được sử dụng ở đây là toán tử xác định được xây dựng.

f:=function(M)local A,B,i,j,v;A:=StructuralCopy(M);if not Size(M)=1 then for i in [1..Size(M)] do for j in [1..Size(M)] do B:=StructuralCopy(M);for v in B do Remove(v,j);od;Remove(B,i);A[i][j]:= (-1)^(i+j)*DeterminantMat(B);od;od;fi;Print(A);end;

vô dụng:

f:=function(M)
    local A,B,i,j,v;
    A:=StructuralCopy(M);
    if not Size(M)=1 then
        for i in [1..Size(M)] do
            for j in [1..Size(M)] do
                B:=StructuralCopy(M);
                for v in B do
                    Remove(v,j);
                od;
                Remove(B,i);
                 A[i][j]:= (-1)^(i+j)*DeterminantMat(B);
            od;
        od;
    fi;
    Print(A);
end;

1

Độ dài v2 , 196 byte

IncludeTypePackage<Matrix>
IncludeTypePackage<OutputSystem>
print=OutputSystem:NewOutput<DEFAULT>
input=Matrix:Adjugate<ARGV0>
input=Matrix:Transpose<input>
OutputSystem:DisplayAsText<print;input>

Hãy thử trực tuyến!

NB: Hiện tại không hoạt động trên TIO, đang chờ. Nên làm việc nhé

Đưa đầu vào dưới dạng ((a b)(c d))để thể hiện

[abcd]

Mặc dù đã có sẵn nội dung cho phiên tòa, tính dài dòng của Verbosity vẫn làm tê liệt nó. Khá cơ bản về cách thức hoạt động của nó, chỉ cần chuyển đổi các phần tử của đầu vào.

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.