エルミート行列?


17

この課題では、複素数の処理や理解が必要ないことに注意してください。

すべての要素が2要素(Re、Im)整数リストである空でない正方行列が与えられた場合、これがエルミート行列を表すかどうかを決定(真理値/偽値または2つの一貫した値を与える)します。

入力は整数の3D配列であることに注意してください。複素数の2D配列ではありません。言語で3D配列を直接取得できない場合は、フラットリストを使用できます(それが役立つ場合は、n×nまたはn×n×2の形状)。

行列は、それ自身の共役転置に等しい場合、エルミート行列です。言い換えると、左上から右下の対角線上でそれを反転し、すべての2要素リーフリストの2番目の要素を無効にすると、入力行列と同じになります。反転と否定の順序は無関係であることに注意してください。したがって、最初に否定し、その後反転することができます。

ウォークスルーの例

この例では、読みやすくするために、余分な空白を含む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番目の要素を否定します。

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

非エルミート人

[[[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。(私は閉会に投票していませんが、誰かがいるのを見るので、コミュニティがこれについてどう思うか興味があります)。
スティーヴィーグリフィン

5
@Adámできる限り明示的にしますが、それはあなた次第です。通常、入力および出力形式の柔軟性が望まれますが、特に入力が実数の3D配列であると言う場合、デフォルトでは推測できません複素数の2D配列ではありません。3Dアレイ入力フォーマットの概念がどれほど広いかは明らかではありません
ルイスメンドー

3
@Adám2Dマトリックスのペア(実部用、虚部用)を入力として使用できますか?
ディルナン

1
@dylnanいいえ。入力は、リーフ次元にRe-Imペアが含まれる、ある種の3次元を表す単一の構造である必要があります。
アダム

回答:


10

R、71 48 47バイト

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

実数の3D配列を取り、虚数の2D配列を作成し、転置、共役、比較します。

バイトカウントを驚異的な23バイト削減した@Giuseppeと、最後の1 バイトを@Vloに感謝します!

オンラインでお試しください!

例:

> 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 arf私はそれを試したと思ったが、明らかにそうではなかった。ありがとう!
プランナパス

1
また、isSymmetric存在し、エルミート複雑なマトリックスのために動作しますが、1x1ケースがあるため注意が必要です[滴の属性と、それは、その結果complexではなくmatrix
ジュゼッペ・

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'

オンラインでお試しください!

チャレンジテキストの説明を教えてくれたLuis Mendoに感謝します。

説明:

MATLABおよびOctaveでは'、共役複素転置は「通常の」転置ではありません。

y3Dマトリックスの最初のレイヤーと2番目のレイヤーに複素単位を乗算した変数インラインを作成しますj。つまり、実数項が最初の「レイヤー」であり、虚数が2番目の「レイヤー」である複素マトリックスです。次に、それが複素共役転置と等しいかどうかを確認します。

これは1、trueの場合にのみ含まれるマトリックスと0falseの場合に少なくとも1つを含むマトリックスを出力します。これらは、Octave (Proof)では真と偽と見なされます。



5

APL(Dyalog Unicode)22 15 9 7バイト

⍉≡⊢∘-

オンラインでお試しください!

暗黙のプレフィックス機能。

Dfnの7バイトのAdámと、暗黙のバージョンを見つけるのに役立った私の愚かさを我慢しくれたAdámとErikTheOutgolferに感謝します。

暗黙バージョンの2バイトのngnに感謝します。

どうやって?

⍉≡⊢∘- 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バイト

#==#&[#.{1,I}]&

オンラインでお試しください!



@alephalphaどうもありがとう。私はそれ0xf3c7が転置演算子であることを知っていますが、何0xf3c8ですか?
ジョナサンフレッチ

1
@alephalphaもあります0xf3c9Wolfram Documentation)。
ジョナサンフレッチ

4

ジャワ8、137の 136 134 126 119バイト

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

1エルミート型の場合は返します0。それ以外の場合は返します。

説明:

オンラインでお試しください。

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,j;         //  Index-integers
  for(;i-->0;)       //  Loop over the rows
    for(j=l;j-->0;)  //   Inner loop over the columns
      r=m[i][j][0]!=m[j][i][0] 
                     //    If the first numbers diagonally aren't equal,
        |m[i][j][1]!=-m[j][i][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×Ø+⁼

1エルミート入力などを返すモナドリンク0

オンラインでお試しください!

どうやって?

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

現代のゼリーにはあると思うØ+
リルトシアスト

@lirtosiast確かにあなたは正しいです、それを使用するために更新されました。ありがとう!
ジョナサンアラン



1

Perl 5、-a0 48バイト

旧カウント:50バイト(+2ためa0)。組み込みの転置を持たない言語にとっては悪くない

,実数部と虚数部の間に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

、7バイト

=¹mmṀ_T

オンラインでお試しください!

どうやって?

代わりに動作するはずですmm、迷惑なバグあるため、使用できません:(

=¹mmṀ_T–完全なプログラム。タプルのリストのリストとして、コマンドライン引数から入力を受け取ります。
  m T –入力のトランスポーズの各リストについて...
   mṀ_– ...含まれる各タプルの最後の値を否定します。
=¹–これが入力と同じかどうかを確認します。


1

C(GCC) 107の 103 100バイト

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どうもありがとう。代わりに、インデックスの参照解除- -おかしい...数時間前、私は心の中でまさにこのゴルフがあったが、単純に...忘れてしまった
ジョナサンFRECH

@ceilingcatありがとうございます。
ジョナサンフレッチ

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

私は提出を行っていたときに1バイトをゴルフアウトしqCmm.e_Fbkました。最終的な提出のバイトカウントを編集するのを忘れていたようです。@ Mr.Xcoder関係なく、私はそれを修正しました、キャッチのおかげです!
スティーブンH.

0

C、 111   110  108バイト

1バイトを保存してくれた@Jonathan Frechと2バイトを保存してくれた@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+=...||...
ジョナサンフレッチ

@JonathanFrechはい、そうです。ありがとう!
Steadybox

0

実際には、13バイト

;┬⌠⌠d±@q⌡M⌡M=

オンラインでお試しください!

説明:

;┬⌠⌠d±@q⌡M⌡M=
;              make a copy
 ┬             transpose copy
  ⌠⌠d±@q⌡M⌡M   for each row:
   ⌠d±@q⌡M       for each cell in row:
    d              remove last element from list
     ±             swap sign
      @q           insert at end of list
            =  compare equality with original
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.