로드 중...
검색 중...
일치하는 항목 없음
기록

기호 레코드는 실제 데이터입니다. GAMS Transfer Matlab에서는 Matlab 기본 데이터 구조(구조체, 테이블, 조밀 또는 희소 행렬)에 저장됩니다(참조)레코드 형식자세한 정보는). GDX에서 레코드는 슬롯 항목 데이터와 값 데이터의 조합입니다. 슬롯 항목은 다음과 같이 제공됩니다.UEL. 값은기호레코드당 저장 수는 기호 유형에 따라 다릅니다.세트가지고element_text, 매개변수가지고그리고방정식그리고변수가지고레벨, 한계, 하위, 상부그리고규모. 이러한 값 필드 중 일부가 제공되지 않으면 기본값이 사용됩니다. 갑레코드 형식은 각 기호에 대해 선택되며 각 값에 대해 독립적으로 선택되지 않습니다. 그러므로 참고하세요, a컨테이너다른 기호를 다른 기호로 저장할 수 있음레코드 형식.

기호 레코드로 작업할 때 잘못될 수 있는 두 가지 사항이 있습니다:

  • 레코드 데이터에는 슬롯 위반이라고 불리는 잘못된 슬롯 항목이 포함되어 있습니다.
    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.records
    ans =
    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

    예를 들어,xas구조체:

    >> x.records
    ans =
    구조체필드 포함:
    i: [6×1 범주형]
    j: [6×1 범주형]
    레벨: [6×1 더블]
    한계: [6×1 더블]
    하위: [6×1 더블]
    상단: [6×1 더블]
    규모: [6×1 더블]
    >> x.records.level
    ans =
    50
    300
    0
    275
    0
    275
    참고
    세트테이블과 같은 형식으로만 유지 관리할 수 있습니다.구조체그리고테이블.
  • 매트릭스 유사 형식:

    형식dense_matrix그리고sparse_matrix레코드 값을 차원이 있는 행렬로 개별적으로 저장최대(2,d), 여기서d기호입니다차원및 모양크기. 만일크기정의되지 않음(참조심볼 슬롯), 행렬과 같은 형식은 불가능합니다. 슬롯 항목은 매트릭스에 저장할 수 없지만 기호 방법을 사용하여 쿼리할 수 있습니다.getUELs(또한 참조고유 요소(UEL)). 기호를 가정s두 가지 차원이 있습니다. 그럼, 가(행,열)행렬 항목은 슬롯 항목에 해당합니다.s.getUELs(1, [행, 열]). 논리는 다양한 차원에 대해 유사합니다.

    예를 들어,xasdense_matrix:

    >> x.records
    ans =
    구조체필드 포함:
    레벨: [2×3 더블]
    한계: [2×3 더블]
    하위: [2×3 더블]
    상단: [2×3 더블]
    규모: [2×3 더블]
    >> x.records.level
    ans =
    50 300 0
    275 0 275

    예를 들어,xinassparse_matrix:

    >> x.records
    ans =
    구조체필드 포함:
    레벨: [2×3 더블]
    한계: [2×3 더블]
    하위: [2×3 더블]
    상단: [2×3 더블]
    규모: [2×3 더블]
    >> x.records.level
    ans =
    (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 ++ + --

기록 형식을 선택하거나 변경하는 가능성은 다음과 같습니다:

기호 레코드 유효성 검사

GAMS Transfer Matlab에서는 지원되는 저장소 중 하나에 기호 레코드를 저장해야 합니다.레코드 형식이해하고 GDX에 쓰기 위해. 그러나 형식의 특정 기준이 충족되지 않고 기호가 유효하지 않은 것으로 표시되는 경우가 쉽게 발생할 수 있습니다. 즉, 기호 방법symbol.Abstract.isValid반환거짓. 이 경우 인수 설정상세symbol.Abstract.isValid무효 이유를 인쇄하여 문제 해결에 도움이 될 수 있습니다.

예를 들어, 다음을 취하세요.x, 물론 유효합니다:

>> x.transformRecords('구조체');
>> x.isValid()
ans =
논리적
1

이 기호를 잘못된 형태로 저장하여 무효화합시다:

>> x.records.level = transpose(x.records.level);
>> x.isValid()
경고: 레코드 값 열'레벨'열 벡터여야 합니다.
> gams.transfer.symbol/Abstract/isValid(라인 912)
ans =
논리적
0

고유 요소(UEL)

고유 요소(UEL)는(i,s)여기서 쌍i(문자열) 라벨의 식별 번호(또는 색인)입니다.s. GDX는 UEL 인덱스를 저장하여 레코드의 슬롯 항목을 효율적으로 저장하기 위해 UEL을 사용합니다.i실제 문자열 대신 슬롯 항목s. 이렇게 하면 동일한 문자열을 여러 번 저장하는 것을 방지할 수 있습니다. UEL의 개념은 Matlab에도 존재하며 a범주형. 처음이시라면범주형: 협력범주형문자열로 작업하는 것처럼 – 이는 단지 메모리를 절약하는 방법일 뿐입니다. 를 변환하는 중범주형uint64(또는 유사)은 식별 번호를 나타냅니다. GAMS Transfer Matlab에서는 다음 중 하나로 식별 번호를 지정할 수 있습니다.범주형(보통 기본값) 또는 숫자를 직접 제공합니다.

참고
범주형문자열을 자르므로 접두사 또는 후행 공백은 지원되지 않습니다. 이를 사용하여 GDX 파일을 읽는 경우 GAMS Transfer Maltab은 대신 식별 번호를 사용합니다.

예를 들어 다음을 참고하세요.범주형inx

>> 전치(x.records.i)
ans =
1×6 범주형 배열
시애틀 시애틀 시애틀 샌디에고 샌디에고 샌디에고
>> 조옮김(x.records.j)
ans =
1×6 범주형 배열
뉴욕 시카고 토피카 뉴욕 시카고 토피카
>> 전치(int64(x.records.i))
ans =
1 1 1 2 2 2
>> 전치(int64(x.records.j))
ans =
1×6 int64 행 벡터
1 2 3 1 2 3
주의
귀하의 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은 다음과 같습니다.

>> 전치(x.getUELs(1))
ans =
1×2 셀 배열
{'시애틀'} {'샌디에고'}
>> 전치(x.getUELs(2))
ans =
1×3 셀 배열
{'뉴욕'} {'시카고'} {'토페카'}

이를 변경하면 일부 기록이 무효화될 수 있습니다:

>> x.setUEL('매디슨', '뉴욕', '시애틀'}, 1);
>> 카테고리(x.records.i)
ans =
3×1 셀 배열
{'매디슨'}
{'뉴욕'}
{'시애틀'}
>> 전치(x.records.i)
ans =
1×6 범주형 배열
시애틀 시애틀 시애틀 <정의되지 않음> <정의되지 않음> <정의되지 않음>
고급 사용자 전용:
다음의 지원에도 불구하고범주형다음을 사용하여 명시적으로 UEL을 추가하는 것이 유용할 수 있습니다.symbol.Abstract.addUELs, 단순히 새로운 UEL을 사용하더라도symbol.Abstract.recordsUEL 목록에 자동으로 추가됩니다. 그러나 실제로 사용된 UEL보다 더 많은 UEL을 저장할 수 있습니다.기록. 고급 사용자는 이 사실을 사용하여 필요에 따라 GDX 파일의 유니버스 세트를 정렬할 수 있습니다. 또한 참조하세요GDX에 쓰는 중.

슬롯 위반

기호가 다른 기호를 사용할 때 슬롯 위반이 발생합니다.세트으로슬롯(s) – 따라서 슬롯 유형입니다일반, 참조심볼 슬롯– 해당 슬롯 항목을 사용합니다.기록해당 참조 슬롯 세트에 존재하지 않습니다. 이러한 슬롯 위반은 데이터를 쓸 때 GDX 오류로 이어집니다!

참고
슬롯 위반 확인은 다음의 일부가 아닙니다.symbol.Abstract.isValid성능상의 이유로.

예를 들어 변경xin– 기억하세요x슬롯 있음i,j, 여기서i그리고j아르세트그리고매디슨세트의 일부가 아닙니다i– 다음과 같습니다:

>> x.records.i(끝) ="매디슨";

슬롯 세트를 업데이트하지 않습니다i:

>> i.records.uni'
ans =
1×2 범주형 배열
시애틀 샌디에고

이것을 GDX 파일에 쓰려는 시도는 실패합니다:

>> m.write();
오류사용 중gt_gdx_write
레코드 x(madison,topeka)의 GDX 오류: 슬롯 위반
gams.transfer.Container/write 오류 (라인 341)
gams.transfer.gt_gdx_write(obj.system_directory, 파일 이름, obj.data, ...

슬롯 위반을 요청하려면 메소드를 호출하세요.symbol.Abstract.getDomainViolations. 다음 목록을 반환합니다.슬롯 위반객체 w.r.t. 슬롯 위반을 해결하는 데 사용할 수 있는 기호의 각 차원: GAMS Transfer Matlab 방법symbol.Abstract.resolveDomainViolations그리고DomainViolation.resolve슬롯 위반을 제거하기 위해 위반된 항목이 있는 슬롯 세트의 자동 확장을 제공합니다.

예를 들어, 위의 예를 계속하면,

>> dv = x.getDomainViolations();

슬롯 위반을 보여줍니다:

>> dv1
ans =
속성 위반:
기호: [1x1 gams.transfer.symbol.Variable]
차원: 1
위반:'매디슨'}

다음 중 하나를 호출

>> x.resolveDomainViolations();
>> dv1.resolve();

해결합니다:

>> dv = x.getDomainViolations()
dv =
0×0 빈 셀 배열
>> i.records.uni'
ans =
1×3 범주형 배열
시애틀 샌디에고 매디슨

이 해결 기능은 기호 속성을 설정하여 자동으로 추가로 트리거될 수 있습니다.symbol.Abstract.domain_forwarding. 만일기록직접 액세스로 업데이트됩니다(참조기호 레코드 할당), 효율성 향상을 위해 슬롯 업데이트가 지연되지만 호출을 통해 강제로 업데이트될 수 있습니다.isValid또는 위에서 언급한 해결 방법.

참고
슬롯 위반을 자동으로 해결하는 방법은 편리할 수 있지만 오류 감지를 위한 유용한 도구인 슬롯 검사를 효과적으로 비활성화합니다. 다음을 사용하는 것이 좋습니다.symbol.Abstract.resolveDomainViolations, DomainViolation.resolve또는symbol.Abstract.domain_forwarding가능한 한 드물게 활성화됩니다. 사용에도 동일하게 적용됩니다.편안한슬롯 정보는 다음과 같습니다.일반슬롯 정보가 가능할 것입니다. 참조심볼 슬롯.