자 코비안 행렬 생성


10

미지수의 벡터를 취하고 여기에 이미지 설명을 입력하십시오일반적인 차별화 함수를 적용합니다 여기에 이미지 설명을 입력하십시오. 행렬식은 다음 매트릭스로 주어진다 여기에 이미지 설명을 입력하십시오되도록 :

여기에 이미지 설명을 입력하십시오

예를 들어, m=3and 라고 가정하십시오 n=2. 그런 다음 (0 기반 색인 사용)

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

f그때 의 야곱은

여기에 이미지 설명을 입력하십시오

이 도전의 목표는이 야 코비 행렬을 인쇄하는 것입니다.

입력

프로그램 / 기능 입력 개의 양의 정수로서 취해야 mn의 부품 수를 나타내고, fu는 각각있다. 입력은 원하는 소스 (stdio, function parameter 등)에서 올 수 있습니다. 당신은 그것들이 수신되는 순서를 지시 할 수 있으며, 이것은 당신의 답변에 대한 입력에 대해 일관성이 있어야합니다 (답에 명시하십시오).

산출

야곱 행렬을 나타내는 것. 이 표현은 야곱 행렬의 모든 요소를 ​​명시 적으로 나타내야하지만, 각 용어의 정확한 형태는 구별되고 무엇이 무엇인지에 대해 모호하지 않고 모든 항목이 논리적 순서로 출력되는 한 정의 된 구현입니다. 행렬을 나타내는 데 사용할 수있는 형식의 예 :

  1. 외부 목록의 각 항목이 Jacobian의 행에 해당하고 내부 목록의 각 항목이 Jacobian의 열에 해당하는 목록 목록.
  2. 각 행이 Jacobian의 행이고 행으로 구분 된 각 구분자 항목은 Jacobian의 열에 해당하는 문자열 또는 텍스트 출력입니다.
  3. 매트릭스의 그래픽 / 비주얼 표현. 예 : MatrixForm명령을 사용할 때 Mathematica에 표시되는 것
  4. 모든 항목이 이미 메모리에 저장되어 있고 쿼리 할 수있는 다른 밀도가 높은 매트릭스 개체입니다 (예 : 생성기 개체를 사용할 수 없음). Mathematica가 내부적으로 Matrix 객체를 나타내는 방법의 예

입력 형식 예 :

  1. 형태의 문자열 d f_i/d u_j, i그리고 j정수입니다. 예 : d f_1/d u_2. d및 사이 f_1또는 공백 x_2은 선택 사항입니다. 또한 밑줄도 선택 사항입니다.
  2. 형식의 문자열 d f_i(u_1,...,u_n)/d u_j또는 d f_i(u)/d u_j. 즉, 기능 컴포넌트의 입력 매개 변수 f_i는 선택 사항이며 명시 적으로 철자하거나 간결한 형식으로 남겨 둘 수 있습니다.
  3. 형식화 된 그래픽 출력. 예 : 식을 평가할 때 Mathematica가 인쇄하는 것D[f_1[u_,u_2,...,u_n],u_1]

시작 색인 u과 시작 색인을 선택할 수 있습니다 f(답변에 지정하십시오). 출력은 원하는 싱크로 올 수 있습니다 (stdio, return value, output parameter 등).

테스트 사례

다음 테스트 사례는 규칙을 사용합니다 m,n. 인덱스는 0부터 시작합니다.

1,1
[[d f0/d u0]]

2,1
[[d f0/d u0],
 [d f1/d u0]]

2 2
[[d f0/d u0, d f0/d u1],
 [d f1/d u0, d f1/d u1]]

1,2
[[d f0/d u0, d f0/d u1]]

3,3
[[d f0/d u0, d f0/d u1, d f0/d u2],
 [d f1/d u0, d f1/d u1, d f1/d u2],
 [d f2/d u0, d f2/d u1, d f2/d u2]]

채점

이것은 코드 골프입니다. 바이트 단위의 가장 짧은 코드가 이깁니다. 표준 허점은 금지되어 있습니다. 원하는 내장 기능을 사용할 수 있습니다.

답변:


4

파이썬, 63 바이트

lambda m,n:["df%d/du%%d "%i*n%tuple(range(n))for i in range(m)]

의 경우 m=3,n=2출력

['df0/du0 df0/du1 ', 'df1/du0 df1/du1 ', 'df2/du0 df2/du1 ']

문자열 형식은보다 명백한 것보다 1 바이트 짧습니다.

lambda m,n:[["df%d/du"%i+`j`for j in range(n)]for i in range(m)]

3

R, 93 78 바이트

function(M,N){v=vector();for(i in 1:N){v=cbind(v,paste0("df",1:M,"/du",i))};v}

번호 매기기는 1부터 시작합니다.

@AlexA 덕분에 -15 바이트 remaks!


1
함수 이름을 제거하여 몇 바이트를 절약 할 수 있습니다 f=. R은 함수에서 마지막으로 평가 된 것을 반환하므로 v대신 대신 사용할 수 있습니다 return(v).
Alex A.

1
OP가 허용하는 0 대신 1에서 색인을 작성하여 바이트를 저장할 수도 있습니다.
Alex A.

@AlexA. 매우 흥미로운 발언, 대단히 감사합니다!
프레데릭

천만에요. :)
Alex A.

3

Maxima, 68 바이트

내가 사랑하는 C와 Matlab을 아는 것처럼 Maxima를 모른다는 것은 너무 나쁘다. 그러나 그럼에도 불구하고 노력할 것입니다.

f(m,n):=(x:makelist(x[i],i,m),g:makelist(g[i](x),i,n),jacobian(g,x))

TeXmacs를 Maxima 인터프리터로 사용하는 예제 세션은 주로 깔끔한 수학 렌더링에 사용됩니다.

TeXmacs의 Maxima 세션

Maxima에서 목록을 작성하는 더 좋은 방법이있을 수 있습니다 (특히 목록 표시없이 함수를 표시하도록하고 싶습니다 ([])). 나는 언어를 충분히 알지 못합니다.


1

루비, 53 바이트

f인덱스가 0이고 인덱스 u가 1입니다. 온라인으로 사용해보십시오!

->m,n{m.times{|i|p (1..n).map{|j|"d f#{i}/d u#{j}"}}}

각 행은 아래와 같이 배열 표현으로 한 줄을 차지합니다. 사양을 준수하지 않는 경우 알려 주시면 해결하겠습니다.

["d f0/d u1", "d f0/d u2", "d f0/d u3"]
["d f1/d u1", "d f1/d u2", "d f1/d u3"]

1

체다 , 79 49 바이트

m->n->(|>m).map(i->(|>n).map(j->"df%d/du%d"%i%j))

분명히이 답변 의 포크 .

대한 3,2반환 :

[["df0/du0", "df0/du1", "df0/du2"], ["df1/du0", "df1/du1", "df1/du2"]]

0

젤리, 18 바이트

ps⁴’“ df“/du”ż$€€G

사용해보십시오!

주어진 (m, n) = (3, 2) , 인쇄 (공백이 표시된 ·:)

·df0/du0·df0/du1
·df1/du0·df1/du1
·df2/du0·df2/du1

0

C, 125 바이트 :

main(w,y,b,q){scanf("%d %d",&w,&y);for(b=0;b<w;b++){for(q=0;q<y;q++)printf("d f%d/du u%d%s",b,q,q<y-1?", ":"");printf("\n");}}

입력을 2 개의 공백으로 구분 된 정수로 취하고 b yJacobian Matrix를 y쉼표 로 구분 된 문자열로 b줄 에 출력합니다 .

C 온라인! (Ideone) 또는 테스트 스위트 (Ideone)

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