เมทริกซ์ Hermitian?


18

โปรดทราบว่าความท้าทายนี้ไม่จำเป็นต้องจัดการหรือทำความเข้าใจกับตัวเลขที่ซับซ้อน

รับตารางเมทริกซ์ที่ไม่ว่างเปล่าซึ่งทุกองค์ประกอบเป็นรายการจำนวนเต็มสององค์ประกอบ (Re, Im) พิจารณา

โปรดทราบว่าการป้อนข้อมูลเป็นอาร์เรย์ 3D ของจำนวนเต็ม ไม่ใช่อาร์เรย์ 2 มิติของจำนวนเชิงซ้อน หากภาษาของคุณไม่สามารถใช้อาร์เรย์ 3D โดยตรงคุณอาจใช้รายการแบบคงที่ (และรูปร่าง n × n หรือ n × n × 2 หากมีสิ่งนั้นช่วย)

เมทริกซ์คือเทียนถ้ามันเท่ากับตัวของมันเองtranspose ผัน กล่าวอีกนัยหนึ่งถ้าคุณพลิกมันในแนวทแยงมุมด้านบนซ้ายไปล่างขวาและลบล้างองค์ประกอบที่สองของลิสต์ทั้งสององค์ประกอบมันจะเหมือนกับเมทริกซ์อินพุท โปรดทราบว่าลำดับการพลิกและการคัดค้านนั้นไม่เกี่ยวข้องดังนั้นคุณอาจปฏิเสธก่อนแล้วจึงค่อยพลิกหลัง

ตัวอย่างการเดิน

ตัวอย่างนี้ใช้ JSON ด้วยพื้นที่สีขาวฟุ่มเฟือยเพื่อความสะดวกในการอ่าน:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

ไขว้ (พลิกข้ามเส้นทแยงมุม NW - SE):

[[ [2, 0] , [2,-1] , [4, 0] ],
 [ [2, 1] , [3, 0] , [0,-1] ],
 [ [4, 0] , [0, 1] , [1, 0] ]]

ปฏิเสธองค์ประกอบที่สองของรายการใบไม้:

[[ [2, 0] , [2, 1] , [4, 0] ],
 [ [2,-1] , [3, 0] , [0, 1] ],
 [ [4, 0] , [0,-1] , [1, 0] ]]

เนื่องจากนี่เป็นสิ่งเดียวกันกับอินพุตเมทริกซ์คือเฮอร์เมียน

กรณีทดสอบ

เทียน

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,0]]]

[[[1,0],[2,0]],[[2,0],[1,0]]]

[[[1,0],[2,-3]],[[2,3],[1,0]]]

[[[42,0]]]

Non-เทียน

[[[2,0],[2,1],[4,0]],[[2,-1],[3,0],[0,1]],[[4,0],[0,-1],[1,-1]]]

[[[0,1],[0,2]],[[0,2],[0,1]]]

[[[1,0],[2,3]],[[2,3],[1,0]]]

[[[3,2]]]


@ LuisMendo ฉันยังคงคิด ความคิดใด ๆ
อดัม

สำหรับบันทึกMeta-postใหม่นั้น (ฉันไม่ได้ลงคะแนนให้ปิด แต่ฉันเห็นบางคนมีดังนั้นฉันอยากรู้ว่าชุมชนคิดอย่างไรเกี่ยวกับเรื่องนี้)
Stewie Griffin

5
@ Adámฉันจะทำให้ชัดเจนที่สุด แต่ก็ขึ้นอยู่กับคุณ โดยปกติแล้วต้องการความยืดหยุ่นในรูปแบบอินพุตและเอาต์พุต แต่ไม่สามารถอนุมานได้โดยค่าเริ่มต้นโดยเฉพาะเมื่อคุณพูดว่าอินพุตเป็นอาร์เรย์ 3 มิติของจำนวนจริง ไม่ได้เป็นอาร์เรย์ 2 มิติของตัวเลขที่ซับซ้อน ยังไม่ชัดเจนว่าแนวคิดของคุณเกี่ยวกับรูปแบบอินพุตอาร์เรย์แบบสามมิติกว้างเท่าไร
Luis Mendo

3
@ Adámเมทริกซ์ 2D สามารถ (หนึ่งส่วนสำหรับส่วนจริงส่วนหนึ่งสำหรับส่วนจินตภาพ) สามารถใช้เป็นอินพุตได้หรือไม่?
dylnan

1
@dylnan ไม่ใช่อินพุตจะต้องเป็นโครงสร้างเดียวที่แสดงถึงการเรียงลำดับของ 3 มิติบางส่วนที่มิติของใบไม้ประกอบด้วยคู่ Re-Im
อดัม

คำตอบ:


10

R, 71 48 47 ไบต์

function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)

รับจำนวนจริงของสามมิติสร้างจำนวนของจำนวนจินตภาพเรียงสลับผันผันและเปรียบเทียบ

ขอบคุณ@Giuseppeสำหรับการลดจำนวนไบต์ด้วย 23 ไบต์ที่น่าประหลาดใจและ@Vloสำหรับ 1 สุดท้าย!

ลองออนไลน์!

ตัวอย่าง:

> A <- array(c(2,2,4,2,3,0,4,0,1,0,-1,0,1,0,-1,0,1,0),dim=c(3,3,2))
> A
, , 1

     [,1] [,2] [,3]
[1,]    2    2    4
[2,]    2    3    0
[3,]    4    0    1

, , 2

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]   -1    0    1
[3,]    0   -1    0

> f <- function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)
> f(A)
[1] TRUE

1
B=A[,,1]+A[,,2]*1iควรบันทึกไม่กี่ไบต์
Giuseppe

@Giuseppe arf ฉันคิดว่าฉันพยายาม แต่ก็ดูเหมือนจะไม่ ขอบคุณ!
plannapus

1
นอกจากนี้ยังisSymmetricมีอยู่และใช้งานได้กับเมทริกซ์เชิงซ้อนของ Hermitian แต่1x1กรณีนี้มีความซับซ้อนเนื่องจาก[คุณสมบัติลดลงและส่งผลให้เกิดการcomplexแทนที่matrix
Giuseppe

2
function(A)all(Conj(t(B<-A[,,1]+A[,,2]*1i))==B)การกำหนดในบรรทัดจะประหยัด 1
Vlo

7

คู่ , 39 34 31 ไบต์

@(x)(y=x(:,:,1)+j*x(:,:,2))==y'

ลองออนไลน์!

บันทึกแล้ว 3 ไบต์ขอบคุณ Luis Mendo ที่แจ้งให้ฉันทราบเกี่ยวกับคำชี้แจงในข้อความท้าทาย

คำอธิบาย:

ใน MATLAB และ Octave 'คือการผันคำกริยาแบบคอนจูเกตไม่ใช่การสลับแบบ "ปกติ"

เราสร้างตัวแปรyอินไลน์นั่นคือเลเยอร์แรกของเมทริกซ์ 3D บวกกับเลเยอร์ที่สองคูณด้วยหน่วยที่ซับซ้อนjนั่นคือเมทริกซ์เชิงซ้อนที่คำที่แท้จริงคือ "เลเยอร์แรก" และจินตภาพคือเลเยอร์ที่สอง จากนั้นเราตรวจสอบว่ามันมีค่าเท่ากับคอนจูเกตที่สลับซับซ้อน

สิ่งนี้จะเอาท์พุทเมทริกซ์ที่มีเฉพาะใน1กรณีที่เป็นจริงและเมทริกซ์ที่มีอย่างน้อยหนึ่ง0ถ้าเป็นเท็จ สิ่งเหล่านี้ถือว่าเป็นจริงและเท็จในอ็อกเทฟ(พิสูจน์) (Proof)



5

APL (Dyalog Unicode) , 22 15 9 7 ไบต์

⍉≡⊢∘-

ลองออนไลน์!

ฟังก์ชั่นนำหน้า Tacit

ขอบคุณAdámเป็นเวลา 7 ไบต์ใน Dfn และทั้งAdámและ ErikTheOutgolfer ที่ทนต่อความโง่เขลาของฉันช่วยให้ฉันค้นหาเวอร์ชันโดยปริยาย

ขอบคุณ ngn สำหรับ 2 ไบต์ในเวอร์ชันโดยปริยาย

อย่างไร?

⍉≡⊢∘- Anonymous tacit function.
      ¨  Apply to each element of the argument:
     \   Cumulative reduction, using
  ⊢∘-    Ignore the first element, then negate the second
        And match
        To the argument's transposition.

5

ภาษา Wolfram (Mathematica) , 45 34 33 26 21 18 ไบต์

  • ที่บันทึกไว้สิบเอ็ดไบต์ขอบคุณที่จองฮวานมิน
  • บันทึกขอบคุณไบต์มาร์ตินเอนเดอร์
  • ที่บันทึกไว้เจ็ดไบต์ขอบคุณที่alephalpha
  • ที่บันทึกไว้ห้าไบต์ขอบคุณที่alephalpha
  • บันทึกสามไบต์
#==#&[#.{1,I}]&

ลองออนไลน์!



@alephalpha ขอบคุณมาก; ฉันรู้ว่า0xf3c7เป็นผู้ดำเนินการขนย้าย แต่คือ0xf3c8อะไร?
Jonathan Frech

1
@alephalpha นอกจากนี้ยังมี0xf3c9( เอกสาร Wolfram )
Jonathan Frech

4

Java 8, 137 136 134 126 119 116 ไบต์

m->{int r=1,l=m.length,i=l*l,j,k;for(;i-->0;)r=m[j=i/l][k=i%l][0]!=m[k][j][0]|m[j][k][1]!=-m[k][j][1]?0:r;return r;}

-3 ไบต์ขอบคุณ@ceilingcat @ceilingcat

ส่งคืน1ถ้า Hermitian0อย่างอื่น

คำอธิบาย:

ลองออนไลน์

m->{                 // Method with 3D integer-array as parameter and boolean return-type
  int r=1,           //  Flag-integer `r`, starting at 1
      l=m.length,    //  The size of the 3D input array
      i=l*l,j,k;     //  Index-integers
  for(;i-->0;)       //  Loop over the rows and columns
    r=m[j=i/l][k=i%l][0]!=m[k][j][0]
                     //   If the first numbers diagonally aren't equal,
      |m[j][k][1]!=-m[k][j][1]?
                     //   or the second numbers aren't negatives of each other:
       0             //    Set the flag `r` to 0
      :              //   Else:
       r;            //    Leave the flag `r` the same
  return r;}         //  Return the flag `r`



3

เยลลี่ ,  6  5 ไบต์

Z×Ø+⁼

ลิงก์ monadic ที่ส่งคืน1สำหรับอินพุตของ Hermitian และ0อื่น ๆ

ลองออนไลน์!

อย่างไร?

Z×Ø+⁼ - Link: list of lists of lists, M
Z     - transpose
  Ø+  - literal = [1,-1]
 ×    - multiply (vectorises)
    ⁼ - equal to M?

Ø+ผมเชื่อว่าที่ทันสมัยมีเจลลี่
lirtosiast

@lirtosiast แน่นอนว่าคุณถูกต้องอัปเดตเพื่อใช้งาน ขอบคุณ!
Jonathan Allan



1

Perl 5 , -a0 48 ไบต์

การนับแบบเก่า: 50 ไบต์ ( +2ต่อa0) ไม่เลวสำหรับภาษาที่ไม่มีการแปลงในตัว (ฉันไม่อิจฉาเลยไม่มี Sirree)

ให้อินพุตเมทริกซ์บน STDIN ,ระหว่างส่วนจริงและจินตภาพดังนั้นเช่น:

2,0 2,1 4,0
2,-1 3,0 0,1
4,0 0,-1 1,0

จะพิมพ์1สำหรับผู้นับถือนิกายไม่มีอะไรอย่างอื่น

#!/usr/bin/perl -a0
say@F~~[map/(\S+,)(\S+)/gc?$1.-$2:(),(/.+/g)x@F]

ลองออนไลน์!


1

Husk , 7 ไบต์

=¹mmṀ_T

ลองออนไลน์!

อย่างไร?

โปรดทราบว่าควรใช้งานmm ได้ แต่มีข้อบกพร่องที่น่ารำคาญซึ่งทำให้ฉันไม่สามารถใช้งานได้ :(

= ¹mmṀ_T - โปรแกรมเต็มรูปแบบ รับอินพุตจากบรรทัดคำสั่ง args เป็นรายการของสิ่งอันดับ
  m T - สำหรับแต่ละรายการในการโอนข้อมูลของอินพุต ...
   mṀ_ - ... ลบล้างค่าสุดท้ายของ tuple แต่ละอันที่มีอยู่
= ¹ - ตรวจสอบว่านี่เหมือนกับอินพุตหรือไม่


1

C (gcc) , 107 103 100 ไบต์

  • ที่บันทึกไว้สี่ไบต์ขอบคุณที่Steadybox ; golfed A[0]ไป*Aสองครั้ง
  • ที่บันทึกไว้สามไบต์ขอบคุณที่ceilingcat
j,k,r;f(A,s)int***A;{for(r=0,j=s;j--;)for(k=s;k--;)r|=*A[j][k]-*A[k][j]|A[j][k][1]+A[k][j][1];A=!r;}

ลองออนไลน์!



@ Steadybox ขอบคุณมาก ตลก ... ไม่กี่ชั่วโมงที่ผ่านมาฉันมีสนามกอล์ฟนี้อยู่ในใจ - dereferencing แทนการจัดทำดัชนี - แต่เพียงลืม ...
Jonathan Frech

@ceilingcat ขอบคุณ
Jonathan Frech

0

แท้จริง 13 ไบต์

┬⌠⌠Çá╫k⌡M⌡Mß=

ลองออนไลน์!

มันทำงานอย่างไร?

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

┬⌠⌠Çá╫k⌡M⌡Mß=  –> Full program.
┬              –> Transpose.
 ⌠       ⌡M    –> For each list in the input's transpose do the following:
  ⌠    ⌡M         –> For each two-element list of the form [a, b]...
   Ç              –> Turn it into a complex number (a+bi).
    á             –> Find its complex conjugate: Push (a-bi).
     ╫k           –> Push [Re(N), Im(N)], so [a, -b].
           ß=  –> Check whether the result equals the input.

0

Pyth, 9 ไบต์

qCmm,hk_e

คำอธิบาย:

qCmm,hk_ekdQQ  Autofill variables
    ,hk_ek     [a,-b]...
  mm      dQ    ...for each [a,b] in the input (m...Q)'s rows (m...d).
 C             Transpose.
q           Q  Is this result equal to the original?

ชุดทดสอบ


คำตอบของคุณเป็นจริง 9 ไบต์ ... ทางเลือกที่ 9 qCmm*V_B1ไบต์:
Mr. Xcoder

ฉันเล่นกอล์ฟหนึ่งไบต์ขณะที่ฉันส่งผลงานจากqCmm.e_Fbk... ดูเหมือนว่าฉันลืมแก้ไขจำนวนไบต์ในการส่งครั้งสุดท้าย @ Mr.Xcoder ฉันแก้ไขมันโดยไม่คำนึงถึงขอบคุณสำหรับการจับ!
สตีเฟนเอช

0

C,  111   110  108 ไบต์

ขอบคุณ @Jonathan Frech สำหรับการบันทึกไบต์และขอบคุณ @ceilingcat สำหรับการบันทึกสองไบต์!

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;return!r;}

ลองออนไลน์!

C (gcc) ,  106  104 ไบต์

i,j,r;f(A,n)int*A;{for(r=i=0;i<n*2;i+=2)for(j=n*2;j;r|=A[i*n+j]-A[j*n+i]|A[i*n-~j]+A[j*n-~i])j-=2;A=!r;}

ลองออนไลน์!


ฉันคิดว่าr|=...|...ทำงานได้ดีเช่นr+=...||...กัน
Jonathan Frech

@JonathanFrech ใช่มันเป็นเช่นนั้น ขอบคุณ!
Steadybox

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