기호 레코드는 실제 데이터입니다. GAMS Transfer Matlab에서는 Matlab 기본 데이터 구조(구조체, 테이블, 조밀 또는 희소 행렬)에 저장됩니다(참조)레코드 형식자세한 정보는). GDX에서 레코드는 슬롯 항목 데이터와 값 데이터의 조합입니다. 슬롯 항목은 다음과 같이 제공됩니다.UEL. 값은기호레코드당 저장 수는 기호 유형에 따라 다릅니다.세트가지고element_text, 매개변수가지고값그리고방정식그리고변수가지고레벨, 한계, 하위, 상부그리고규모. 이러한 값 필드 중 일부가 제공되지 않으면 기본값이 사용됩니다. 갑레코드 형식은 각 기호에 대해 선택되며 각 값에 대해 독립적으로 선택되지 않습니다. 그러므로 참고하세요, a컨테이너다른 기호를 다른 기호로 저장할 수 있음레코드 형식.
기호 레코드로 작업할 때 잘못될 수 있는 두 가지 사항이 있습니다:
- 기록 데이터가 선택한 형식을 만족하지 않습니다.
- 무슨 문제인지 물어보세요symbol.Abstract.isValid, 참조기호 레코드 유효성 검사.
- 레코드 데이터에는 슬롯 위반이라고 불리는 잘못된 슬롯 항목이 포함되어 있습니다.
- symbol.Abstract.[has|count|get|find]DomainViolations를 사용하여 슬롯 위반을 요청하면 됩니다.슬롯 위반.
레코드 형식
GAMS Transfer Matlab은 네 가지 형식으로 기호 레코드를 읽고 유지 관리할 수 있습니다.구조체, 테이블, dense_matrix그리고sparse_matrix. 둘 다구조체그리고테이블테이블과 같은 형식이며dense_matrix그리고sparse_matrix– 분명히 – 행렬과 같은 형식입니다. 기본값은테이블좋은 데이터 표시 및 개요가 가능하기 때문입니다. 그러나 참고하세요테이블가장 효율적인 형식은 아닙니다.
- 표와 같은 형식:
형식
테이블그리고구조체첫 번째에 슬롯 항목을 저장차원열 다음에 값 열(element_textfor설정,값용매개변수그리고레벨,한계,하위,상위,규모for변수그리고수식) 및 레코드를 행으로 표시합니다. 의 경우구조체, 열은 구조체 필드로 제공됩니다. 슬롯 항목 열의 열 이름은 다음과 같이 표시하고 변경할 수 있습니다.symbol.Abstract.domain_labels.예를 들어,
x에예으로테이블:>> x.recordsans =6×7 테이블i j 레벨 한계 하위 상위 스케일_________ ________ _____ ________ _____ _____ _____시애틀신규-요크 50 0 0 정보 1시애틀 시카고 300 0 0 Inf 1시애틀 토피카 0 0.036 0 Inf 1샌디에고신규-요크 275 0 0 정보 1샌디에고 시카고 0 0.009 0 Inf 1산디에고 토피카 275 0 0 Inf 1예를 들어,
x에예as구조체:>> x.recordsans =구조체필드 포함:i: [6×1 범주형]j: [6×1 범주형]레벨: [6×1 더블]한계: [6×1 더블]하위: [6×1 더블]상단: [6×1 더블]규모: [6×1 더블]>> x.records.levelans =5030002750275
- 참고
- 세트테이블과 같은 형식으로만 유지 관리할 수 있습니다.
구조체그리고테이블.
- 매트릭스 유사 형식:
형식
dense_matrix그리고sparse_matrix레코드 값을 차원이 있는 행렬로 개별적으로 저장최대(2,d), 여기서d기호입니다차원및 모양크기. 만일크기정의되지 않음(참조심볼 슬롯), 행렬과 같은 형식은 불가능합니다. 슬롯 항목은 매트릭스에 저장할 수 없지만 기호 방법을 사용하여 쿼리할 수 있습니다.getUELs(또한 참조고유 요소(UEL)). 기호를 가정s두 가지 차원이 있습니다. 그럼, 가(행,열)행렬 항목은 슬롯 항목에 해당합니다.s.getUELs(1, [행, 열]). 논리는 다양한 차원에 대해 유사합니다.예를 들어,
x에예asdense_matrix:>> x.recordsans =구조체필드 포함:레벨: [2×3 더블]한계: [2×3 더블]하위: [2×3 더블]상단: [2×3 더블]규모: [2×3 더블]>> x.records.levelans =50 300 0275 0 275예를 들어,
xin예assparse_matrix:>> x.recordsans =구조체필드 포함:레벨: [2×3 더블]한계: [2×3 더블]하위: [2×3 더블]상단: [2×3 더블]규모: [2×3 더블]>> x.records.levelans =(1,1) 50(2,1) 275(1,2) 300(2,3) 275행렬 요소에 대한 슬롯 항목을 얻으려면 위의 예에서 다음이 유지된다는 점에 유의하십시오.
x.getUELs(1, 1:2)는 과 같습니다.'시애틀', '샌디에고'}x.getUELs(2, 1:3)은 와 같습니다.'뉴욕', '시카고', '토페카'}
- 참고
- 스칼라 기호의 경우(차원동일 0), 형식
구조체그리고dense_matrix동등합니다.
각 형식에는 장점과 단점이 있습니다. 다음 표를 참조하십시오. 거기, 평점은++(아주 좋아요),+, o, -, --(다소 나쁨), 각 카테고리에 대해 상대적으로 평가되었습니다.
| 레코드 형식 | 최대 크기 | 효율성 | 메모리(일반) | 메모리(밀도 데이터) | 디스플레이 |
|---|---|---|---|---|---|
구조체 | 20 (GAMS 제한) | ++ | + | - | - |
테이블 | 20 (GAMS 제한) | -- | o | -- | ++ |
dense_matrix | 20 (GAMS 제한) | + | -- | ++ | - |
sparse_matrix | 2 (Matlab 제한) | o | ++ | + | -- |
기록 형식을 선택하거나 변경하는 가능성은 다음과 같습니다:
- 다음 경우의 형식을 지정하십시오.GDX에서 읽는 중.
- GAMS Transfer Matlab이 제공된 데이터를 기반으로 레코드 형식을 선택하도록 합니다.symbol.Abstract.setRecords.
- 다음을 사용하여 레코드를 다른 형식으로 변환symbol.Abstract.transformRecords.
- 속성을 사용하여 레코드 형식을 변경합니다(레코드를 변환하지 않고)symbol.Abstract.format.
기호 레코드 유효성 검사
GAMS Transfer Matlab에서는 지원되는 저장소 중 하나에 기호 레코드를 저장해야 합니다.레코드 형식이해하고 GDX에 쓰기 위해. 그러나 형식의 특정 기준이 충족되지 않고 기호가 유효하지 않은 것으로 표시되는 경우가 쉽게 발생할 수 있습니다. 즉, 기호 방법symbol.Abstract.isValid반환거짓. 이 경우 인수 설정상세의symbol.Abstract.isValid에참무효 이유를 인쇄하여 문제 해결에 도움이 될 수 있습니다.
예를 들어, 다음을 취하세요.x의예, 물론 유효합니다:
이 기호를 잘못된 형태로 저장하여 무효화합시다:
고유 요소(UEL)
고유 요소(UEL)는(i,s)여기서 쌍i(문자열) 라벨의 식별 번호(또는 색인)입니다.s. GDX는 UEL 인덱스를 저장하여 레코드의 슬롯 항목을 효율적으로 저장하기 위해 UEL을 사용합니다.i실제 문자열 대신 슬롯 항목s. 이렇게 하면 동일한 문자열을 여러 번 저장하는 것을 방지할 수 있습니다. UEL의 개념은 Matlab에도 존재하며 a범주형. 처음이시라면범주형: 협력범주형문자열로 작업하는 것처럼 – 이는 단지 메모리를 절약하는 방법일 뿐입니다. 를 변환하는 중범주형에uint64(또는 유사)은 식별 번호를 나타냅니다. GAMS Transfer Matlab에서는 다음 중 하나로 식별 번호를 지정할 수 있습니다.범주형(보통 기본값) 또는 숫자를 직접 제공합니다.
- 참고
범주형문자열을 자르므로 접두사 또는 후행 공백은 지원되지 않습니다. 이를 사용하여 GDX 파일을 읽는 경우 GAMS Transfer Maltab은 대신 식별 번호를 사용합니다.
예를 들어 다음을 참고하세요.범주형inx의예
- 주의
- 귀하의 Matlab(또는 Octave) 버전이 지원하지 않는 매우 드문 경우
범주형(R2013b 이전의 Matlab 또는 Octave 버전) 계속해서 UEL에 대해 주의 깊게 읽어 보십시오. 의 슬롯 열에 UEL 색인을 저장해야 합니다.symbol.Abstract.records. 문자열 저장은 지원되지 않습니다. 해당 문자열을 찾으려면 다음 메소드를 사용하세요.symbol.Abstract.getUELs. 그렇지 않으면 사용할 수 있는 경우범주형– 가능성이 매우 높음 – 필요하지 않을 것입니다.기호UEL 추가 또는 수정에 관한 방법, 아래 설명.
각 기호는 차원당 고유한 UEL 목록을 유지하며, 이는 메소드를 통해 액세스하고 수정할 수 있습니다.symbol.Abstract.getUELs, symbol.Abstract.setUELs, symbol.Abstract.addUELs, symbol.Abstract.removeUELs, symbol.Abstract.renameUELs그리고symbol.Abstract.reorderUELs(또는 수정을 위한 Matlab 함수범주형직접). UEL 인덱스는 1부터 각 차원에 대해 독립적으로 저장된 UEL 수까지 번호가 지정됩니다.
- 주의
- 방법symbol.Abstract.setUELs그리고symbol.Abstract.removeUELs다른 UEL 색인을 UEL 라벨에 재할당할 수 있습니다. 이러한 변경 사항은 다음에서 사용되는 인덱스에 적용됩니다.symbol.Abstract.records. 이는에서 사용되는 UEL을 제거함을 의미합니다.symbol.Abstract.records그러면 잘못된 슬롯 항목이 발생하게 됩니다(다음과 같이 표시됨
<정의되지 않음>Matlab에서). 에 대한symbol.Abstract.setUELs, ''rename', true` 인수를 전달하여 이러한 업데이트를 비활성화할 수 있습니다.
예를 들어, 계속해서예위에서 UEL은 다음과 같습니다.
이를 변경하면 일부 기록이 무효화될 수 있습니다:
- 고급 사용자 전용:
- 다음의 지원에도 불구하고
범주형다음을 사용하여 명시적으로 UEL을 추가하는 것이 유용할 수 있습니다.symbol.Abstract.addUELs, 단순히 새로운 UEL을 사용하더라도symbol.Abstract.recordsUEL 목록에 자동으로 추가됩니다. 그러나 실제로 사용된 UEL보다 더 많은 UEL을 저장할 수 있습니다.기록. 고급 사용자는 이 사실을 사용하여 필요에 따라 GDX 파일의 유니버스 세트를 정렬할 수 있습니다. 또한 참조하세요GDX에 쓰는 중.
슬롯 위반
기호가 다른 기호를 사용할 때 슬롯 위반이 발생합니다.세트으로슬롯(s) – 따라서 슬롯 유형입니다일반, 참조심볼 슬롯– 해당 슬롯 항목을 사용합니다.기록해당 참조 슬롯 세트에 존재하지 않습니다. 이러한 슬롯 위반은 데이터를 쓸 때 GDX 오류로 이어집니다!
- 참고
- 슬롯 위반 확인은 다음의 일부가 아닙니다.symbol.Abstract.isValid성능상의 이유로.
예를 들어 변경xin예– 기억하세요x슬롯 있음i,j, 여기서i그리고j아르세트그리고매디슨세트의 일부가 아닙니다i– 다음과 같습니다:
슬롯 세트를 업데이트하지 않습니다i:
이것을 GDX 파일에 쓰려는 시도는 실패합니다:
슬롯 위반을 요청하려면 메소드를 호출하세요.symbol.Abstract.getDomainViolations. 다음 목록을 반환합니다.슬롯 위반객체 w.r.t. 슬롯 위반을 해결하는 데 사용할 수 있는 기호의 각 차원: GAMS Transfer Matlab 방법symbol.Abstract.resolveDomainViolations그리고DomainViolation.resolve슬롯 위반을 제거하기 위해 위반된 항목이 있는 슬롯 세트의 자동 확장을 제공합니다.
예를 들어, 위의 예를 계속하면,
슬롯 위반을 보여줍니다:
다음 중 하나를 호출
해결합니다:
이 해결 기능은 기호 속성을 설정하여 자동으로 추가로 트리거될 수 있습니다.symbol.Abstract.domain_forwarding에참. 만일기록직접 액세스로 업데이트됩니다(참조기호 레코드 할당), 효율성 향상을 위해 슬롯 업데이트가 지연되지만 호출을 통해 강제로 업데이트될 수 있습니다.isValid또는 위에서 언급한 해결 방법.
- 참고
- 슬롯 위반을 자동으로 해결하는 방법은 편리할 수 있지만 오류 감지를 위한 유용한 도구인 슬롯 검사를 효과적으로 비활성화합니다. 다음을 사용하는 것이 좋습니다.symbol.Abstract.resolveDomainViolations, DomainViolation.resolve또는symbol.Abstract.domain_forwarding가능한 한 드물게 활성화됩니다. 사용에도 동일하게 적용됩니다.
편안한슬롯 정보는 다음과 같습니다.일반슬롯 정보가 가능할 것입니다. 참조심볼 슬롯.