เมทริกซ์โคแฟคเตอร์


18

เมทริกซ์เป็นปัจจัย transpose ของAdjugate เมทริกซ์ องค์ประกอบของเมทริกซ์นี้คือโคแฟคเตอร์ของเมทริกซ์ดั้งเดิม

โคแฟคเตอร์ป้อนคำอธิบายรูปภาพที่นี่(เช่นองค์ประกอบของเมทริกซ์โคแฟคเตอร์ที่แถว i และคอลัมน์ j) คือดีเทอร์มิแนนต์ของเมทริกซ์ย่อยที่เกิดขึ้นโดยการลบแถว ith และคอลัมน์ jth จากเมทริกซ์ดั้งเดิมคูณด้วย (-1) ^ (i + j)

ตัวอย่างเช่นสำหรับเมทริกซ์

ป้อนคำอธิบายรูปภาพที่นี่

องค์ประกอบของเมทริกซ์โคแฟคเตอร์ที่แถว 1 และคอลัมน์ 2 คือ:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถค้นหาข้อมูลเกี่ยวกับสิ่งที่ปัจจัยของเมทริกซ์และวิธีการในการคำนวณพวกเขาที่นี่

ท้าทาย

เป้าหมายของคุณคือส่งออกเมทริกซ์โคแฟคเตอร์ของเมทริกซ์อินพุท

หมายเหตุ : Built-in ที่ประเมินการฝึกอบรมปัจจัยหรือเมทริกซ์ adjugate หรือปัจจัยหรือสิ่งที่คล้ายกันจะได้รับอนุญาต

อินพุต

เมทริกซ์อาจถูกป้อนเป็นอาร์กิวเมนต์บรรทัดคำสั่งเป็นพารามิเตอร์ฟังก์ชันในSTDINหรือในวิธีที่เหมาะสมที่สุดสำหรับภาษาที่คุณใช้

เมทริกซ์จะถูกจัดรูปแบบเป็นรายการรายการแต่ละรายการย่อยที่สอดคล้องกับหนึ่งแถวซึ่งมีปัจจัยที่เรียงลำดับจากซ้ายไปขวา จัดเรียงแถวจากบนลงล่างในรายการ

ตัวอย่างเช่นเมทริกซ์

a b
c d

[[a,b],[c,d]]จะแสดงโดย

คุณสามารถแทนที่วงเล็บเหลี่ยมและเครื่องหมายจุลภาคด้วยอย่างอื่นถ้ามันเหมาะกับภาษาของคุณและมีเหตุผล (เช่น((a;b);(c;d)))

การฝึกอบรมจะมีเพียงจำนวนเต็ม (ซึ่งอาจจะเป็นลบ)

เมทริกซ์จะเป็นสี่เหลี่ยมจัตุรัสเสมอ (เช่นจำนวนแถวและคอลัมน์เท่ากัน)

คุณอาจคิดว่าอินพุตจะถูกต้องเสมอ (เช่นไม่มีปัญหาการจัดรูปแบบไม่มีอะไรอื่นนอกจากจำนวนเต็มไม่มีเมทริกซ์ที่ว่างเปล่า)

เอาท์พุต

เมทริกซ์โคแฟคเตอร์ที่ได้นั้นอาจถูกSTDOUTส่งออกไป, ส่งคืนจากฟังก์ชั่น, เขียนไปยังไฟล์หรืออะไรก็ตามที่คล้ายกันซึ่งเหมาะสมกับภาษาที่คุณใช้

[[d,-c],[-b,a]]เมทริกซ์ปัจจัยต้องจัดรูปแบบในลักษณะเดียวกันที่แน่นอนการฝึกอบรมการป้อนข้อมูลที่จะได้รับเช่น หากคุณอ่านสตริงคุณจะต้องส่งกลับ / ส่งออกสตริงที่เมทริกซ์ถูกจัดรูปแบบเหมือนกับในอินพุต หากคุณใช้บางอย่างเช่นรายการของรายการเป็นอินพุตคุณจะต้องส่งคืนรายการเช่นกัน

กรณีทดสอบ

  • การป้อนข้อมูล: [[1]]

เอาท์พุท: [[1]]

  • การป้อนข้อมูล: [[1,2],[3,4]]

เอาท์พุท: [[4,-3],[-2,1]]

  • การป้อนข้อมูล: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

เอาท์พุท: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • การป้อนข้อมูล: [[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]]

เอาท์พุท:

[[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]]

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


2
ฉันไม่แน่ใจว่าจะตีความเมทริกซ์โคแฟคเตอร์ได้อย่างไรในรูปแบบเดียวกันกับที่เมทริกซ์อินพุตป้อนเข้าสำหรับการส่งฟังก์ชั่นที่รับอินพุตจากอาร์กิวเมนต์และส่งคืนค่า เราอ่าน / ส่งคืนเมทริกซ์จริงหรือการแทนค่าสตริงของมันหรือไม่?
Dennis

1
กล่าวโดยย่อ: ถ้าคุณอ่านสตริงคุณจะต้องส่งกลับ / ส่งออกสตริงที่เมทริกซ์ได้รับการจัดรูปแบบเหมือนกับในอินพุต หากคุณใช้บางอย่างเช่นรายการของรายการคุณจะต้องส่งคืนรายการด้วย
ทำให้เสียชีวิต

เมทริกซ์ 1x1 มีเมทริกซ์โคแฟคเตอร์หรือไม่
เลียม

นอกจากนี้กรณีทดสอบสุดท้ายของคุณดูเหมือนจะเป็นเมทริกซ์ adjugate (การเปลี่ยนจากสิ่งที่ควรจะเป็น) เว้นแต่ฉันจะเข้าใจผิด
เลียม

@ICanHazHats ถูกต้องฉันแก้ไขแล้วขอบคุณ
ทำให้เสียชีวิต

คำตอบ:


1

J, 29 ไบต์

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

เอปไซลอน / ผกผัน / ดีเทอร์มิแนนต์เดียวกัน จากขวาไปซ้าย:

  • 1e_9+ เพิ่มเอปไซลอน
  • (-/ .**%.)คือดีเทอร์มีแนนต์ ( -/ .*) คูณอินเวอร์ส ( %.),
  • |: transposes,
  • <.0.5+ รอบ

5

Matlab, 42 33 ไบต์

ใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:

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

อินพุทและเอาท์พุทเป็นเมทริกซ์ (อาร์เรย์ตัวเลข 2 มิติ)

epsเพิ่มในกรณีที่เมทริกซ์เป็นเอกพจน์ มันคือ "ถูกลบ" โดยใช้round(ผลลัพธ์จริงรับประกันว่าจะเป็นจำนวนเต็ม)

ตัวอย่าง:

>> @(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

ตัวอย่างที่มีเมทริกซ์เอกฐาน:

>> @(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

หรือลองออนไลน์ใน Octave


2
อย่างไรก็ตามฉันมีความกังวลที่ฉันไม่ได้พูดคุยในความท้าทาย: คำตอบนี้อนุมานว่าเมทริกซ์อินพุตกลับด้านได้ ใช้รหัสของคุณในการพูดว่า[1,0 ; 0,0]ให้ข้อผิดพลาดเมื่อมันควรจะออก[0,0 ; 0,1]
เสียชีวิต

1
เมื่อคุณกลับมาจากฟังก์ชั่นฉันไม่คิดว่าคุณควรจะต้องmat2str: "เมทริกซ์โคแฟคเตอร์ที่ได้อาจเป็น ... ส่งคืนจากฟังก์ชัน"
FryAmTheEggman

1
@FryAmTheEggman ขอบคุณ! แต่ " เมทริกซ์โคแฟคเตอร์จะต้องจัดรูปแบบในลักษณะเดียวกันกับเมทริกซ์อินพุตที่ได้รับ " นั่นเป็นเหตุผลที่ฉันคิดว่าฉันต้องการmat2str
Luis Mendo

1
@ กระชับใช่มันเป็นอย่างนั้น epsประมาณ 1e-16 มันทำให้เมทริกซ์ไม่เป็นเอกพจน์ (แต่ไม่ค่อยมีเงื่อนไข) ผลลัพธ์ไม่ได้เป็นจำนวนเต็มอย่างแน่นอน ดังนั้นfix(ปัดไปทางศูนย์) แก้ไขได้ .5งานนี้จัดให้มีข้อผิดพลาดไม่เกิน ฉันกลัวว่าจะไม่มีการรับประกัน สำหรับจำนวนเต็มที่มากอาจล้มเหลว ฉันบอกว่ามันเป็นกลอุบายสกปรก :-P
Luis Mendo

1
@ ทำให้เกิดความชัดเจนคุณช่วยบอกได้ไหมว่าmat2strที่นี่จำเป็นไหม? สำหรับฉันแล้วมันรู้สึกเหมือนว่านี่เป็นฟังก์ชั่นอินพุตจริงๆแล้วคือเมทริกซ์ที่ไม่จัดรูปแบบ เช่นถ้าคุณลองf=...ทำสิ่งf(f(...))นี้จะไม่ทำงาน แต่การลบmat2strทำให้การทำงานดีขึ้น
FryAmTheEggman


3

R, 121 94 ไบต์

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

นี่เป็นฟังก์ชั่นที่ยาวอย่างไร้เหตุผลที่ยอมรับวัตถุของคลาสmatrixและส่งคืนวัตถุอื่น หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

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 bytesใช้mapplyแทนouterและVectorize
Giuseppe

2

GAP , 246 ไบต์

คุณสามารถบอกได้ว่านี่คือการเข้ารหัสที่ดีโดยวงซ้อนสามชั้น

มันค่อนข้างตรงไปตรงมา GAP ไม่มีเครื่องมือแบบเดียวกับที่จะจัดการกับเมทริกซ์ที่ภาษาเชิงคณิตศาสตร์อื่นทำ สิ่งเดียวที่ใช้จริงที่นี่คือตัวดำเนินการดีเทอร์มิแนนต์

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;

ungolfed:

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

Verbosity v2 , 196 ไบต์

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

ลองออนไลน์!

หมายเหตุ: ขณะนี้ไม่สามารถใช้งาน TIO กำลังรอการดึง ควรทำงานแบบออฟไลน์

รับอินพุตในแบบฟอร์ม ((a b)(c d))เพื่อแทนค่า

[ad]

แม้จะมี builtin สำหรับ adjugate verbosity verbosity ยังคงง่อยมัน ค่อนข้างพื้นฐานว่ามันทำงานอย่างไรเพียงแค่สลับ adjugate ของอินพุต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.