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

배열 구조(Array Construction)

배열 구조(Array Construction)

이제 변수가 배열임을 선언하는 방법을 알았으므로 다음 단계는 해당 배열의 모든 요소를 채우는 것입니다.모델리카에서 배열을 구성하는 방법에는 여러 가지가 있습니다.

리터럴(Literals)

벡터(Vectors)

배열을 구성하는 가장 간단한 방법은 각 개별 요소를 열거하는 것입니다. 예를 들어, 벡터를 나타내는 x 라는 변수에 대한 다음 파라미터 선언이 주어집니다.

parameter Real x[3];

여기에서 "vector"라는 용어를 사용할 때 첨자 차원이 하나만 있는 배열을 참조합니다. 이 벡터에 값을 할당하려면 다음과 같이 할 수 있습니다.

parameter Real x[3] = {1.0, 0.0, -1.0};

분명히 변수 x 는 3개의 실수 성분을 가진 벡터입니다. 일관성을 위해 우변도 3개의 실수 성분이 있는 벡터여야 하는데, 다행히도 그렇습니다. {1.0, 0.0, -1.0} 표현식은 벡터를 구성하기 위한 모델리카의 특수 구문입니다.쉼표로 구분된 표현식 목록을 포함하는 한 쌍의 {} 구문을 사용하여 원하는 크기의 벡터를 만들 수 있습니다. 를 들면 아래와 같습니다.

parameter Real x[5] = {1.0, 0.0, -1.0, 2.0, 0.0};

{} 표기법을 사용하여 모든 차원의 배열을 구성할 수도 있습니다. 예를 들면 아래와 같습니다.

parameter Real B[2,3] = {{1.0, 2.0, 3.0}, {5.0, 6.0, 7.0}};

범위 회전(Range Notation)

모델리카에는 일련 번호 또는 균일한 간격의 숫자로 구성된 벡터를 구성하기 위한 속기 표기법이 포함되어 있습니다.예를 들어 1에서 5까지의 값을 갖는 요소가 있는 정수 벡터를 구성하려면 다음 구문을 사용할 수 있습니다.

1:5       // {1, 2, 3, 4, 5}

동일한 구문을 사용하여 부동 소수점 숫자 배열을 구성할 수 있습니다.

1.0:5.0   // {1.0, 2.0, 3.0, 4.0, 5.0}

부동 소수점 표현 문제로 인해 벡터에 최종 값이 포함되지 않을 수 있으므로 이러한 방식으로 실수 벡터를 사용할 때 주의해야 합니다. 다음과 같은 대안도 사용할 수 있습니다(아마도 더 강력할 것임).

1.0*(1:5)             // {1.0, 2.0, 3.0, 4.0, 5.0}
{1.0*i for i in 1:5}  // {1.0, 2.0, 3.0, 4.0, 5.0}

첫 번째 값과 마지막 값 사이에 "스트라이드(stride)"를 추가하여 값 사이의 간격이 1이 아닌 범위를 구성할 수도 있습니다. 예를 들어, 3과 9 사이의 모든 홀수는 다음과 같이 나타낼 수 있습니다.

3:2:9   // {3, 5, 7, 9}

부동 소수점 숫자를 다룰 때도 사이 간격 값을 삽입할 수 있습니다.이 범위 표기법은 enumeration 자료형과 함께 사용할 수도 있습니다(그러나 이 경우 stride 값은 허용되지 않습니다).

매트릭스 구성(Matrix Construction)

그러나 행렬(정확히 2개의 첨자 차원이 있는 배열)을 구성하는 데 사용하는 특수 구문도 있다는 점에 유의하는 것이 중요합니다.이니셜라이저를 사용한 다음 파라미터 선언을 살펴보겠습니다.

parameter Real B[2,3] = [1.0, 2.0, 3.0; 5.0, 6.0, 7.0];

이 경우 파라미터 B 의 수학적 표기법은 다음과 같습니다.

\begin{split}B = \left[ \begin{array}{ccc} 1.0 & 2.0 & 3.0 \\ 5.0 & 6.0 & 7.0 \end{array} \right]\end{split}

모델리카 코드와 수학적 표현에서 볼 수 있듯이 행렬 B 에는 2개의 행과 3개의 열이 있습니다.이러한 방식으로 배열을 구축하는 구문은 벡터를 구축하는 것보다 약간 더 복잡합니다.표면적으로 벡터는 {} 로 둘러싸여 있는 반면 행렬은 [] 로 둘러싸여 있음을 알 수 있습니다.그러나 더 중요한 것은 쉼표 와 세미콜론 이 구분 기호로 사용된다는 것입니다.세미콜론은 행을 구분하는 데 사용되고 쉼표는 열을 구분하는 데 사용합니다.

이 행렬 구성 표기법의 좋은 기능 중 하나는 벡터 또는 부분 행렬을 포함할 수 있다는 것입니다.

이 임베딩이 수행되는 방법을 보여주기 위해 다음 행렬을 구성하려는 경우를 살펴 보겠습니다.

\begin{split}C = \left[ \begin{array}{ccc} \left| \begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array} \right| & \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| & \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| \\ \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| & \left| \begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array} \right| & \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| \\ \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| & \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| & \left| \begin{array}{cc} 2 & 1 \\ 1 & 2 \end{array} \right| \end{array} \right]\end{split}

먼저 각 부분 행렬을 만든 다음 다음과 같이 이러한 부분 행렬을 사용하여 C 를 채워서 모델리카에서 이 작업을 간결하게 수행할 수 있습니다.

parameter D[2,2] = [2, 1; 1, 2];
parameter Z[2,2] = [0, 0; 0, 0];
parameter C[6,6] = [D, Z, Z;
                    Z, D, Z;
                    Z, Z, D];

즉, ,; 구분 기호는 스칼라 또는 부분 행렬과 함께 작동합니다.

곧 보게 되겠지만, 이러한 방식으로 행렬을 만들 때 매우 유용할 수 있는 몇 가지 다른 배열 구성 함수가 있습니다."

임의의 크기의 배열(Arrays of Any Size)

지금까지 벡터와 행렬에 대해 논의했습니다. 그러나 배열을 일련의 중첩된 벡터로 구성하여 임의 개수의 차원(벡터 및 행렬 포함)을 사용하여 임의의 배열을 구성할 수 있으며,예를 들어 3차원 배열을 구성하려면 다음과 같이 벡터 컬렉션을 간단히 중첩할 수 있습니다.

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

이 예제에서 볼 수 있듯이 이 중첩 구성에서 가장 안쪽에 있는 요소는 선언에서 가장 오른쪽 차원에 해당합니다. 즉, 여기서 배열은 두 개의 요소를 포함하는 벡터입니다. 여기서 각 두 요소는 세 개의 요소를 포함하는 벡터이고 각 세 요소는 4개의 스칼라로 구성된 벡터입니다.

배열 내포(Array Comprehensions)

지금까지 배열에 포함된 요소를 열거하여 벡터, 행렬 및 고차원 배열을 구성하는 방법을 살펴보았습니다.고차원 배열의 경우에서 볼 수 있듯이 이러한 구조는 매우 복잡해질 수 있습니다.다행스럽게도 모델리카에는 프로그래밍 방식으로 배열을 구성하기 위한 편리한 구문을 제공하는 배열 이해 기능이 포함되어 있습니다.

배열 내포를 사용하면 몇 가지 이점이 있습니다.첫 번째는 훨씬 더 간결한 표기법이라는 것이며, 두 번째는 배열의 값이 다양한 인덱스에 연결되는 방식을 쉽게 표현할 수 있다는 것입니다. 세 번째는 표현식이 필요한 컨텍스트에서 수행할 수 있다는 것입니다(일반적으로 변수 선언에서 변수에 대한 값 제공). 마지막으로 일부 시뮬레이션 소프트웨어는 배열 이해를 최적화하는 것이 더 쉬울 수 있습니다.

배열 내포를 시연하려면 배열의 요소와 배열 인덱스 사이의 다음 관계를 고려 해야 합니다.

a_{ijk} = i\ x_j\ y_k

여기서 x y 는 벡터입니다. 일련의 중첩된 벡터를 사용하여 이러한 배열을 재귀적으로 정의하는 방법을 이미 살펴보았습니다.그러나 또한 그러한 표현이 잠재적으로 얼마나 오래 걸릴 수 있고 읽고 쓰는 것이 얼마나 지루한지 보았습니다.배열 내포를 사용하면 다음과 같이 매우 쉽게 a 배열을 구성할 수 있습니다.

parameter Real a[10,12,15] = {i*x[j]*y[k] for k in 1:15,
                                              j in 1:12,
                                              i in 1:10};

이 코드는 몇 줄의 모델리카 코드만으로 1800개의 요소로 배열을 만듭니다.