厄米矩阵?


18

请注意,此挑战不需要处理或理解复数。

给定一个非空方阵,其中每个元素都是一个由两个元素组成的(Re,Im)整数列表,请确定(给出任何真伪值或任何两个一致值)这是否代表一个埃尔米特矩阵。

注意,输入是一个3D整数数组。不是复数的2D数组。如果您的语言不能直接采用3D数组,则可以采用平面列表(如果有帮助,可以使用n×n或n×n×2形状)。

如果矩阵等于其自身的共轭转置,则为Hermitian。换句话说,如果将它跨过其左上角到右下角的对角线,并取反所有两个元素的叶列表的第二个元素,则它与输入矩阵相同。请注意,翻转和否定的顺序无关紧要,因此您可以先取反,然后再取反。

步行示例

本示例使用带有多余空白的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] ]]

由于这与输入相同,因此矩阵为Hermitian。

测试用例

埃尔米提安

[[[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。(我尚未投票决定关闭,但我看到有人投票了,所以我很好奇社区对此的看法)。
Stewie Griffin

5
@Adám我会让它尽可能地明确,但这取决于您。通常希望输入和输出格式具有灵活性,但是默认情况下无法推断出灵活性,尤其是当您说输入是3D实数数组时;不是2D复数数组。目前尚不清楚您的3D阵列输入格式的概念有多广泛
Luis Mendo '18

3
@Adám可以将一对2D矩阵(一个用于实部,一个用于虚部)作为输入吗?
dylnan '18

1
@dylnan编号。输入必须是表示某种3维性的单一结构,其中维包含Re-Im对。
亚当

Answers:


10

R,71 48 47字节

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

取实数的3D数组,虚数的2D数组,转置,共轭和比较。

感谢@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 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'

在线尝试!

感谢Luis Mendo节省了3个字节,他向我介绍了挑战文本中的说明。

说明:

在MATLAB和Octave中,'是共轭复数转置,而不是“常规”转置。

我们创建一个变量y内联,它是3D矩阵的第一层加上第二层乘以复数单位j,即一个复数矩阵,其中实项是第一“层”,而虚数是第二“层”。然后,我们检查它是否等于复共轭转置本身。

这将输出仅包含1true的矩阵,以及包含0false的至少一个矩阵的矩阵。在Octave (Proof)中将它们视为是非。



5

APL(Dyalog Unicode)22 15 9 7个字节

⍉≡⊢∘-

在线尝试!

隐式前缀功能。

感谢Adám在Dfn上提供7个字节,并感谢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文档)。
乔纳森·弗雷希

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

1如果是Hermitian,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*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

J,14个字节

[:(+-:|:)j./"1

在线尝试!

说明

[:(+-:|:)j./"1  Input: 3d array
         j./"1  Reduce by complex combine at rank 1
[:              Cap, operate on the 2d array of complex values
   +              Conjugate
      |:          Transpose
    -:            Match?

同样是14:-:0 2|:(,-)/"1
FrownyFrog


3

果冻 6  5 字节

Z×Ø+⁼

返回1Hermitian输入的单子链接,0否则返回。

在线尝试!

怎么样?

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

我相信现代的果冻有Ø+
lirtosiast

@lirtosiast确实您是正确的,已更新为可以使用它;谢谢!
乔纳森·艾伦

2

05AB1E,9个字节

øεεX®‚*]Q

在线尝试!

说明

ø           # transpose
 ε          # apply to each 2-d array
  ε         # apply to each pair
   X®‚*     # multiply by [1,-1]
       ]    # end apply(s)
        Q   # compare to input for equality


1

Perl 5,-a0 48字节

旧计数:50个字节(+2用于a0)。对于没有内置转置语言的语言来说还不错(我一点也不嫉妒,没有s弱)

给定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字节

  • 多亏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非常感谢。好笑...几个小时前,我完全想起了这种高尔夫运动-取消引用而不是编制索引-但只是忘记了……
乔纳森·弗雷赫18/02/26 '16

@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
Xcoder先生18年

在提交时,我打了一个字节,qCmm.e_Fbk显然……我忘了在最终提交中编辑字节数。@ Mr.Xcoder我不管如何都解决了,谢谢!
史蒂文H.

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) 106104 字节

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.