주요 콘텐츠

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

가변 크기 데이터 오류의 진단 및 수정

크기 불일치 오류의 진단 및 수정

문제: 가변 크기 행렬을 고정 크기 행렬에 할당

생성 코드에서 가변 크기 행렬을 고정 크기 행렬에 할당할 수 없습니다. 다음 예제를 살펴보겠습니다.

function Y = example_mismatch1(n) %#codegen
assert(n < 10);
B = ones(n,n);
A = magic(3);
A(1) = mean(A(:));
if (n == 3)
    A = B;
end
Y = A;

이 함수를 컴파일하면 다음 오류가 발생합니다.

??? Dimension 1 is fixed on the left-hand side 
but varies on the right ...

이 오류를 수정하는 방법에는 여러 가지가 있습니다.

  • coder.varsize 구문을 추가하여 행렬 A의 크기를 늘리는 것을 허용합니다.

    function Y = example_mismatch1_fix1(n) %#codegen
    coder.varsize('A');
    assert(n < 10);
    B = ones(n,n);
    A = magic(3);
    A(1) = mean(A(:));
    if (n == 3)
        A = B;
    end
    Y = A;

  • assert 문을 수정하여 행렬 B의 크기를 3×3으로 명시적으로 제한합니다.

    function Y = example_mismatch1_fix2(n) %#codegen
    coder.varsize('A');
    assert(n == 3)
    B = ones(n,n);
    A = magic(3);
    A(1) = mean(A(:));
    if (n == 3)
        A = B;
    end
    Y = A;
  • 명시적 인덱싱을 사용하여 BA와 동일한 크기로 만듭니다.

    function Y = example_mismatch1_fix3(n) %#codegen
    assert(n < 10);
    B = ones(n,n);
    A = magic(3);
    A(1) = mean(A(:));
    if (n == 3)
        A = B(1:3, 1:3);
    end
    Y = A;

문제: 빈 행렬의 형태가 가변 크기 사양과 일치하도록 변경됨

빈 행렬 []을 가변 크기 데이터에 할당하면, coder.varsize 사양과 일치하도록 MATLAB®이 생성 코드에서의 데이터의 형태를 자동으로 변경할 수 있습니다. 예를 들면 다음과 같습니다.

function Y = test(u) %#codegen
Y = [];
coder.varsize('Y', [1 10]);
if u < 0
    Y = [Y u];
end

이 예제에서 coder.varsizeY를 최대 10개의 요소로 구성된 열 벡터로 정의하므로 첫 번째 차원은 크기 1로 고정됩니다. 명령문 Y = []Y의 첫 번째 차원을 0으로 지정하기 때문에 불일치가 발생합니다. 대입식의 우변은 빈 행렬이고 좌변은 가변 크기 벡터입니다. 이 경우 MATLAB은 coder.varsize 사양과 일치하도록 생성 코드에서 빈 행렬 Y = []Y = zeros(1,0)으로 형태 변경합니다.

문제: 묵시적으로 확장된 출력값을 고정 크기 변수에 할당

이항 연산이나 함수의 묵시적으로 확장된 출력값을 다른 크기의 변수에 할당하면 코드 생성기가 오류를 생성할 수 있습니다. 예를 들면 다음과 같습니다.

function out = test(n) %#codegen
x = ones(n,1);
if mod(n,2) == 1
	y = ones(n,n);
	x = y + x;
end 
out = out + x(2);
end

이 예제에서 x는 제한이 없는 벡터입니다. 묵시적 확장으로 인해 xy에 대한 덧셈 연산은 제한이 없는 행렬(Inf×Inf)을 생성합니다. 제한이 없는 벡터 x에 제한이 없는 행렬을 할당하면 오류가 발생합니다.

묵시적으로 확장된 출력값을 사용하려면 출력값과 크기가 동일한 새 변수에 출력값을 할당하십시오.

x의 크기를 유지하고 생성 코드에 묵시적 확장을 적용하지 않으려면 coder.sameSizeBinaryOp (MATLAB Coder)를 사용하여 연산을 적용하십시오. 함수 본문에서 coder.noImplicitExpansionInFunction (MATLAB Coder)을 호출하여, 해당 함수에 대해 생성된 코드에서 묵시적 확장을 비활성화할 수도 있습니다.

묵시적 확장은 피연산자를 자동으로 확장하여 호환 가능한 크기의 배열에 이항 연산을 적용합니다. Generate Code with Implicit Expansion Enabled (MATLAB Coder), Optimize Implicit Expansion in Generated Code (MATLAB Coder), 기본 연산에 대해 호환되는 배열 크기 항목을 참조하십시오.

상한 감지 오류의 진단 및 수정

문제: 행렬 생성자에서 상수가 아닌 차원 사용

동적 메모리 할당을 활성화하면 상수가 아닌 차원을 갖는 행렬에 변수를 할당하여 가변 크기 데이터를 정의할 수 있습니다. 예를 들면 다음과 같습니다.

function y = dims_vary(u) %#codegen
if (u > 0)
    y = ones(3,u);
else
    y = zeros(3,1);
end

사용자가 동적 메모리 할당을 활성화하지 않으면 이 함수는 MATLAB Function 블록에서 오류를 생성합니다. 동적 메모리 할당을 활성화하려면 Use Dynamic Memory Allocation for Variable-Size Arrays in a MATLAB Function Block 항목을 참조하십시오.