Found an issue with the book? Report it on Github.

배열 인덱싱(Array Indexing)

배열 인덱싱(Array Indexing)

이 장에서 배열이 인덱싱되는 방법을 보여주는 많은 예제를 보았기 때문에, 배열을 인덱싱하는 방법을 논의하는 별도의 섹션이 필요하지 않은 것 같습니다.일반적으로 각 첨자에 대해 정수 값을 사용하여 배열의 요소를 참조하는 것은 흔하지만, 어레이를 인덱싱하는 다른 방법이 충분히 있으므로 이에 대해 이야기하는 데 시간을 할애할 가치가 있다고 생각합니다

지수(Indices)

정수(Integers)

분명히 배열을 인덱싱하는 가장 직접적인 방법은 정수를 사용하는 것입니다. 다음과 같이 선언된 배열의 경우

Real x[5,4];

첫 번째 첨자에 1에서 5 사이의 정수를 사용하고 두 번째 첨자에 1에서 4 사이의 정수를 사용하여 배열의 요소를 인덱싱할 수 있습니다.

여기에서 모델리카는 첨자가 벡터가 되도록 허용한다는 점을 기억할 필요가 있습니다.벡터 인덱스의 작동 방식을 이해하기위해 먼저 다음 행렬을 살펴 보겠습니다.

\begin{split}B = \left[ \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array} \right]\end{split}

모델리카에서 이러한 배열은 다음과 같이 선언됩니다.

parameter Real B[3,3] = [1, 2, 3; 4, 5, 6; 7, 8, 9];

다음과 같이 B 의 부분행렬을 추출한다고 생각해 보겠습니다.

parameter Real C[2,2] = [B[1,1], B[1,2]; B[2,1], B[2,2]]; // [1, 2; 4, 5];

다음과 같이 벡터 첨자를 사용하여 동일한 부분 행렬을 더 쉽게 추출할 수 있습니다.

parameter Real C[2,2] = B[{1,2},{1,2}]; // [1, 2; 4, 5];

위에서 보여준 것 처럼 벡터 첨자를 사용하여 임의의 하위 배열을 추출하거나 구성할 수 있습니다.여기에서는 범위 회전(Range Notation) 이 매우 유용할 수 있습니다. 동일한 부분행렬 추출은 다음과 같이 나타낼 수도 있습니다.

parameter Real C[2,2] = B[1:2,1:2]; // [1, 2; 4, 5];

열거형(Enumerations)

화학 시스템(Chemical System) 예제에서 열거형을 사용하여 배열 크기를 지정하는 방법과 enumeration 자료형으로 지정된 값을 사용하여 배열을 인덱싱하는 방법을 살펴보았습니다. 일반적으로 다음과 같은 enumeration 의 경우

type Species = enumeration(A, B, X);

그런 다음 enumeration 이 차원을 지정하는 데 사용하는 배열을 선언합니다.

Real C[Species];

그러면 열거형 값인 Species.A , Species.BSpecies.X 를 인덱스로 사용할 수 있습니다. 예를 들어 다음과 같습니다.

equation
  der(C[Species.A]) = ...;

불리언(Booleans)

열거형 과 거의 같은 방식으로 Boolean 자료형을 사용할 수 있는데, 차원에 대해 Boolean 으로 선언된 배열이 주어지면 아래와 같이 표현할 수 있습니다.

Real C[5,Boolean];

그런 다음 부울 값을 사용하여 해당 차원을 인덱싱할 수 있습니다. 를들어 아래와 같이할 수 있습니다.

equation
  der(C[1,true]) = ...;
  der(C[1,false]) = ...;

끝(end)

배열에 대한 첨자를 지정할 때 첨자 식에 end 를 사용하는 것이 허용되어 있습니다. 이 컨텍스트에서 end 는 해당 배열 차원에 대해 가능한 가장 높은 값을 취합니다. 표현식 내에서 end 를 사용하면 첫 번째 부터 요소를 지정하는 것이 아닌, 마지막 요소와 관련하여 배열 요소를 쉽게 참조할 수 있습니다.예를 들어 벡터의 끝에서 두 번째 요소를 참조하려면 end-1 표현식을 아래 첨자로 사용할 수 있습니다.

end해당 배열 차원 에 대해 가능한 가장 높은 인덱스 값을 취한다는 점을 기억하세요.따라서 다음 배열의 경우:

Integer B[2,4] = [1, 2, 3, 4; 5, 6, 7, 8];

왼쪽 표현식은 오른쪽 주석과 같이 해석합니다.

B[1,end]     // 4
B[end,1]     // 5
B[end,end]   // 8
B[2,end-1]   // 7

Slicing

모델리카에는 배열을 인덱싱하는 또 다른 정교한 방법이 있습니다. 그러나 아직 그것에 대해 지금 논의하는 것보다는 구성요소의 배열(Arrays of Component) 에 대한 논의를 시작할 때 나중에 살펴 보는 것이 좋겠습니다.