행렬-벡터 계산


14

두 개 이상의 요소로 구성된 정수 배열이 주어지면 배열의 Matrix-Vector (아래 정의)를 출력하십시오 .

행렬-벡터 를 계산하려면 먼저 크기 n입력 배열을 회전하여 크기 의 행렬을 만들고 배열 n x n의 첫 번째 요소가 기본 대각선을 따릅니다. 이것은 매트릭스 부분을 형성합니다. 벡터의 경우 입력 배열을 세로로 뒤집습니다. 그런 다음 정규 행렬 곱셈을 수행하십시오. 출력 벡터가 결과입니다.

예를 들어

a = [1, 2, 3]

우선, 수득 오른쪽에 배열 두 번 회전 [3, 1, 2][2, 3, 1]형태하도록 적층 한 후, 3x3행렬

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

그런 다음 배열을 세로로 뒤집어 벡터를 만듭니다.

[[1, 2, 3]    [[1]
 [3, 1, 2]  x  [2]
 [2, 3, 1]]    [3]]

일반적인 행렬 곱셈 수행

[[1, 2, 3]    [[1]    [[1+4+9]    [[14]
 [3, 1, 2]  x  [2]  =  [3+2+6]  =  [11]
 [2, 3, 1]]    [3]]    [2+6+3]]    [11]]

그리고 출력은 [14, 11, 11]또는 [[14], [11], [11]](가의 평평인지 여부의 선택).

실시 예 # 2

a = [2, 5, 8, 3]

[[2, 5, 8, 3]    [[2]    [[4+25+64+9]     [[102]
 [3, 2, 5, 8]  x  [5]  =  [6+10+40+24]  =  [80]
 [8, 3, 2, 5]     [8]     [16+15+16+15]    [62]
 [5, 8, 3, 2]]    [3]]    [10+40+24+6]]    [80]]

[102, 80, 62, 80]

규칙

  • 입력 및 출력은 언어의 기본 정수 유형에 맞는 것으로 가정 할 수 있습니다.
  • 입력 및 출력은 편리한 형식으로 제공 될 수 있습니다 .
  • 전체 프로그램 또는 기능이 허용됩니다. 함수 인 경우 출력하지 않고 출력을 반환 할 수 있습니다.
  • 가능하면 다른 사람들이 귀하의 코드를 시험해 볼 수 있도록 온라인 테스트 환경에 대한 링크를 포함하십시오!
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

답변:


8

젤리 , 5 바이트

ṙJṚæ.

온라인으로 사용해보십시오!

설명

먼저 :

여기서 이다 벡터 및 A는 벡터.vkx

이것은 행렬 곱셈이 행과 열 사이의 내적 일 뿐이라는 것을 보여줍니다.

그런 다음, 실제로 회전 오른쪽으로하고 있다 회전 오른쪽 등으로v1v0vkvk-1

다른 각도에서, 되는 회전 왼쪽 및 되어 회전 왼쪽 등에v1vnvnv1

작동 원리

ṙJṚæ.   input: z (a list of length n)
ṙJ      [rot(z,1), rot(z,2), ..., rot(z,n)] (to the left)
  Ṛ     [rot(z,n), ..., rot(z,2), rot(z,1)]
   æ.   [rot(z,n).z , ..., rot(z,2).z , rot(z,1).z] (dot product)






2

하스켈 , 49 바이트

f v=sum.zipWith(*)v.fst<$>zip(iterate tail$v++v)v

온라인으로 사용해보십시오!

입력 v=[1,2]

  • iterate tail$v++v 목록을 산출 [[1,2,1,2],[2,1,2],[1,2],[2],[],...]
  • fst<$>zip l v동일 take(length v)l하고 수확량[[1,2,1,2],[2,1,2]]
  • sum.zipWith(*)v 각 요소에 매핑되어 벡터 행렬 행 곱을 생성합니다.

내 대답보다 훨씬 똑똑해! 나는 fst<$>zip l v아주 좋아 합니다.
jferard

2

R , 66 62 바이트

sapply(length(n<-scan()):1,function(i)c(n[-(1:i)],n[1:i])%*%n)

온라인으로 사용해보십시오!


사용 Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)은 3 바이트 더 짧습니다. 행렬 목록 만 반환합니다.
Giuseppe

for 루프 for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i]는 이상한 출력 형식을 반환하지 않고 61 바이트입니다.
Giuseppe





1

J , 14 바이트

+/ .*~#\.1&|.]

온라인으로 사용해보십시오!

설명

+/ .*~#\.1&|.]  Input: array M
      #\.       Length of each suffix, forms the range [len(M), ..., 2, 1]
             ]  Identity, get M
         1&|.   For each 'x' in the suffix lengths, rotate left M  by 'x'
+/ .*~          Dot product with M

이것은 꽤 좋다. 하나의 질문. 언제합니까 1&|.당신은 결합되지 않습니다 1|.모나드를 만들어? 그러나 왼쪽과 오른쪽 arg 둘 다에 해당 모나드를 사용하고 왼쪽 하나는 적용 횟수를 결정합니다. 무슨 일이야?
요나

@Jonah의 특별한 형식입니다 &. 로 사용하면 u n&f v수행 중 (n&f)^:u v입니다. 더 많은 구문 분석을 보려면 본드 하단 을 참조하십시오.
마일

아, 틸. 자주 사용하는 것입니까?
Jonah

@Jonah 많은 경우에 골프에 유용합니다. 이 경우 rank를 사용하여 동일한 바이트 수로 수행 할 수 #\.|."{]있었지만 대안을 시도하기 전에 가장 먼저 나온 것을 가장 짧게 게시했습니다.
마일

1

APL, 17 바이트

(↑¯1⌽(⍳≢)⌽¨⊂)+.×⍪

설명:

(↑¯1⌽(⍳≢)⌽¨⊂)+.×⍪

 ↑                      matrix format of
  ¯1⌽                   right rotate by 1 of
     (⍳≢)               the 1..[length N]
         ⌽¨             rotations of
           ⊂            the enclosed input
             +.×        inner product with
                ⍪       1-column matrix of input



1

껍질 , 11 바이트

mΣ§‡*´ṀKoṫ¢

온라인으로 사용해보십시오!

설명

mΣ§‡*´ṀKoṫ¢  Implicit input, e.g. [1,2,3]
          ¢  Cycle: [1,2,3,1,2,3,...
        oṫ   Tails: [[1,2,3,1,2,3...],[2,3,1,2,3...],[3,1,2,3...]...
     ´ṀK     Replace each element of input with input: [[1,2,3],[1,2,3],[1,2,3]]
   ‡*        Vectorized multiplication (truncated with respect to shortest list)
  §          applied to the last two results: [[1,4,9],[2,6,3],[3,2,6]]
mΣ           Sum of each row: [14,11,11]

1

옥타브 - 67 48 바이트

이 코드를 19 바이트 줄인 Luis Mendo에게 감사합니다!

참고 :이 코드는 Octave에서만 실행할 수 있습니다. MATLAB은 변수를 생성하는 표현식을 평가하면서 동시에 변수를 생성 할 수있는 함수 내 표현식을 지원하지 않습니다.

n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'

MATLAB의 원본 코드는 여기에서 찾을 수 있지만 모든 버전의 MATLAB에서 실행할 수 있습니다. 이 코드는 67 바이트입니다.

a=input('');n=numel(a)-1;a(mod(bsxfun(@minus,0:n,(0:n)'),n+1)+1)*a'

설명

  1. a=input('');-표준 입력을 통해 사용자로부터 (행) 벡터를받습니다. 옥타브 형식으로 벡터를 입력해야합니다 (예 :[1,2,3] .
  2. n=numel(...); -입력 벡터의 총 요소 수를 가져옵니다.
  3. x=0:n-1- 0최대에서 증가하는 행 벡터를 만듭니다.n-1 1 .
  4. (x=0:n-1)-x'- 수행합니다 우리가 갖도록 방송 n x n각 행이되도록 매트릭스를 i0부터 최대 요소 n-1행의 각각의 요소 i에 의해 감산이i .
  5. mod(..., n)+1-음수 값을 감싸면 n각 행 i에 0부터 원형 까지의 벡터가 포함됩니다.n-1 으로 왼쪽으로 이동i 요소 . MATLAB / Octave에서 벡터 또는 행렬의 색인을 1로 시작하면 1을 추가합니다.
  6. a(...) -를 만듭니다 n x n (4)를 사용하여 (4)의 각 값에 의해 지정된 입력 벡터의 정확한 인덱스에 액세스하여 필요한 행렬을 얻는 행렬을 만듭니다.
  7. (...)*a' -조옮김 / 뒤집기를 통해 행렬 벡터 곱셈을 수행합니다. a 전에 열 벡터가되도록 를 을 수행합니다.

예제 실행

>> n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'
[1,2,3]

ans =

         14.00
         11.00
         11.00

>> n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'
[2,5,8,3]

ans =

        102.00
         80.00
         62.00
         80.00

온라인으로 사용해보십시오!


대신 암시 적 확장을 사용할 수 있습니다 bsxfun. n없이 정의 -1하면 몇 바이트도 절약됩니다. 그리고 Octave로 제한하면 변수를 즉시 할당 a하고 더 저장할 수 있습니다 . 또한 여기에 더 자주 오십시오 !! :-D0:n
Luis Mendo

@LuisMendo 아 그래. Octave가 이미 암시 적 확장을 지원한다는 사실을 잊었습니다. input함수 안에 변수를 저장하는 것도 좋은 방법입니다. 나는 그것이 그것을지지 할 수 있다고 생각하지 않았다. 내 경험으로는 C 또는 C ++에서만 보았습니다. 감사!
rayryeng-복원 모니카

1
@LuisMendo 제안 된 변경 사항을 곧 수정 사항으로 적용하겠습니다. 나는 바빴지만이 항목이 바이트 수에서 절대로 이길 수 없으므로 이것을 우선 순위로 두지 않았습니다.
rayryeng-복원 모니카

@LuisMendo 변경되었습니다. 대단히 감사합니다 :) 위의 설명을 변경하면서 코드를 이해했습니다.
rayryeng-복원 모니카

기꺼이 내가 도울 수 :-)
Luis Mendo

0

자바 스크립트 79 바이트

입력 배열을 받아서 행렬 벡터의 배열을 출력합니다.

a=>(b=[...a],a.map(x=>([...b].reduce((m,n,i)=>m+=n*a[i],0,b.push(b.shift())))))

설명

a=>(
    b=[...a],                    // copy the input into b
    a.map(x=>(                   // transform a into a new array
        [...b].reduce(           // copy b into a new array and reduce
            (m,n,i)=>m+=n*a[i],  // memo += the element in the array * the ith
                                 // element in a
            0,                   // start memo at 0
            b.push(b.shift())    // shift the first element in b to the end
                                 // not used by reduce, but performing this op
                                 // here saves a few bytes
        )
    ))
)

0

클로저, 80 바이트

#(map(fn[_ c](apply +(map * c %)))%(iterate(fn[c](into[(last c)](butlast c)))%))

iterate무한한 시퀀스를 생성하지만 (take (count %) (iterate ...))중지하기 위해 사용 하는 대신에 %추가 인수로 사용 map합니다.


0

Perl 5 , 65 + 1 (-a) = 66 바이트

@o=@F;for(@o){$r=0;$r+=$_*$F[$i++%@F]for@o;say$r;unshift@F,pop@F}

온라인으로 사용해보십시오!

입력 벡터를 공백으로 구분 된 숫자로 사용합니다. 결과 벡터를 나타내는 줄 바꿈으로 구분 된 숫자를 출력합니다.



0

공통 리스프, 78 바이트

(lambda(x)(loop as i on(append x x)as y in x collect(reduce'+(mapcar'* i x))))

온라인으로 사용해보십시오!

배열 (이 경우 Lisp 목록)을 두 번 i사용 하고 ( x,를 통해 y반복 중지 를 사용하여) 하위 목록을 반복합니다. 그 다음의 각 요소를 승산의 결과를 합산하여 그 결과를 다음의 요소를 계산하는 x각각의 요소 i(다시 짧은 목록이 종료되면 중단 참조).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.