수색…


기존 함수 이름으로 변수의 이름을 지정하지 마십시오.

이미 sum() 함수가 있습니다. 결과적으로 같은 이름의 변수 이름을 지정하면

sum = 1+3;

변수가 여전히 작업 공간에있는 동안 함수를 사용하려고하면

A = rand(2);
sum(A,1)

우리는 비밀스러운 오류 를 얻을 것이다 :

Subscript indices must either be real positive integers or logicals.

변수를 먼저 clear() 한 다음 함수를 사용하십시오.

clear sum

sum(A,1)
ans =
       1.0826       1.0279

이 충돌을 피하기 위해 함수가 이미 존재하는지 어떻게 확인할 수 있습니까?

which()-all 플래그와 함께 사용하십시오.

which sum -all
sum is a variable.
built-in (C:\Program Files\MATLAB\R2016a\toolbox\matlab\datafun\@double\sum)   % Shadowed double method
...

이 결과는 sum 이 먼저 변수이고 다음 메서드 (함수)가 그 함수에 의해 음영 처리된다는 것을 알려줍니다. 즉, MATLAB은 먼저 메서드를 사용하지 않고 변수에 구문을 적용하려고 시도합니다.

당신이 보는 것은 당신이 얻지 못하는 것입니다 : 명령 창에서 char vs cellstring

이것은 새로운 사용자를 겨냥한 기본 예제입니다. charcellstring 의 차이점을 설명하는 데 초점을 맞추지 않습니다.


당신이 없애 싶은 발생할 수있는 ' 당신이 그들을 추가하지 않지만, 당신의 문자열입니다. 사실, 이는 명령 창 에서 일부 유형을 구별하기 위해 사용하는 아티팩트 입니다.

문자열 이 인쇄됩니다.

s = 'dsadasd'
s =
dsadasd

셀 문자열 이 인쇄됩니다.

c = {'dsadasd'};
c = 
    'dsadasd'

작은 따옴표들여 쓰기 가 어떻게 cchar 아닌 cellstring 임을 알리는 인공물 cellstring . 문자열은 실제로 셀에 포함되어 있습니다.

c{1}
ans =
dsadasd

전치 연산자

  • .' MATLAB에서 벡터 또는 행렬을 조 변경 하는 올바른 방법입니다.
  • ' 는 MATLAB에서 벡터 또는 행렬의 복소 공액 전치 (일명 Hermitian conjugate)를 취하는 올바른 방법입니다.

트랜스 포즈를 위해 유의하십시오 .' 아포스트로피 앞에 마침표 가 있습니다. MATLAB이있는 다른 요소에 대한 연산의 구문과 조화이다 * 매트릭스 승산, .* 같이 행렬 요소를 곱한다. 두 명령은 매우 유사하지만 개념적으로 매우 다릅니다. 다른 MATLAB 명령과 마찬가지로이 연산자는 런타임에 "적절한"함수 호출로 바뀌는 "문법적 설탕"입니다. ==eq 함수의 평가가되는 것처럼, 생각해 보라 .' transpose 위한 속기로서. ' (요점이 없으면) 쓰기 ctranspose 실제로 대신 ctranspose 명령을 사용합니다 ctranspose 명령은 흔히 물리학에서 사용되는 Hermitian 접합 이라고도하는 복소수 변환 을 계산합니다. 전치 된 벡터 또는 행렬이 실수 인 한, 두 연산자는 동일한 결과를 생성합니다. 그러나 복소수를 처리하자마자 "올바른"속기를 사용하지 않으면 필연적으로 문제가 발생할 것입니다. "정확한"것은 응용 프로그램에 따라 다릅니다.

복소수를 포함하는 행렬 C 의 다음 예제를 고려하십시오.

>> C = [1i, 2; 3*1i, 4]
C =
   0.0000 + 1.0000i   2.0000 + 0.0000i
   0.0000 + 3.0000i   4.0000 + 0.0000i

속기를 사용하여 조바꿈 을 취해 봅시다 .' (기간 포함). 출력은 예상대로, C 의 전 환 형식입니다.

>> C.'
ans =
   0.0000 + 1.0000i   0.0000 + 3.0000i
   2.0000 + 0.0000i   4.0000 + 0.0000i

자, ' (기간없이) 사용하자. 우리는 전치에 덧붙여 복소수 값이 복소 복소수 로 변환되었음을 알 수 있습니다.

>> C'
ans =
   0.0000 - 1.0000i   0.0000 - 3.0000i
   2.0000 + 0.0000i   4.0000 + 0.0000i

정리해 보면, Hermitian conjugate를 계산하려는 경우, complex conjugate는 전치 (transpose) 한 다음 ' (without the period) ' 를 사용하십시오. 그냥 값을 복소 공액으로 변환하지 않고 트랜스 포즈를 계산하려는 경우 .' 사용하십시오 .' (기간 포함).

Y 유형의 입력 인수에 대해 정의되지 않은 함수 또는 메소드 X

이것은 MATLAB이 당신이 호출하려고하는 함수를 찾을 수 없다는 말의 오랜 바람이 막히는 방식입니다. 이 오류가 발생하는 데에는 여러 가지 이유가 있습니다.

이 함수는 현재 버전의 MATLAB 이후 에 소개 되었습니다.

MATLAB 온라인 문서는 주어진 함수가 어떤 버전으로 도입되었는지를 결정할 수있는 아주 좋은 기능을 제공합니다. 문서의 모든 페이지 왼쪽 하단에 있습니다.

여기에 이미지 설명을 입력하십시오.

현재 버전 ( ver )과이 버전을 비교하여 특정 버전에서이 기능을 사용할 수 있는지 확인하십시오. 그렇지 않은 경우 보관 된 버전의 설명서 를 검색하여 사용중인 버전 에서 적합한 대안을 찾으십시오.

도구 상자가 없습니다!

기본 MATLAB 설치에는 많은 수의 함수가 있습니다. 그러나보다 전문화 된 기능은 도구 상자에 패키지되어 있으며 Mathworks에서 별도로 판매합니다. 도구 상자가 있는지 여부에 관계없이 모든 도구 상자의 설명서가 표시되므로 적절한 도구 상자가 있는지 확인하고 확인하십시오.

특정 기능이 속한 도구 상자를 확인하려면 온라인 설명서의 왼쪽 상단을보고 특정 도구 상자가 언급되어 있는지 확인하십시오.

여기에 이미지 설명을 입력하십시오.

그런 다음 설치된 모든 도구 상자의 목록을 인쇄하는 ver 명령을 실행하여 사용중인 MATLAB 버전의 도구 상자를 확인할 수 있습니다.

해당 도구 상자가 설치되어 있지 않고이 기능을 사용하려면 The Mathworks에서 특정 도구 상자에 대한 라이센스를 구입해야합니다.

MATLAB이 함수를 찾을 수 없습니다.

MATLAB이 여전히 함수를 찾을 수 없으면 사용자 정의 함수 여야합니다. 그것은 다른 디렉토리에 있으며 코드가 실행될 디렉토리를 검색 경로추가 해야 할 수도 있습니다. 당신은 MATLAB을 사용하여 기능을 찾을 수 있는지 여부를 확인할 수 which 소스 파일의 경로를 반환해야한다.

부동 소수점 부정확성에 유의하십시오.

부동 소수점 숫자는 모든 실수를 나타낼 수 없습니다. 이를 부동 소수점 부정확이라고합니다.

무한히 많은 부동 소수점 수가 있으며 무한히 길 수 있습니다 (예 : π ). 따라서 완벽하게 표현할 수 있으면 무한히 많은 양의 메모리가 필요합니다. 이 문제를 보았을 때, 컴퓨터의 "실수"저장 장치에 대한 특수 표현 인 IEEE 754 표준 이 설계되었습니다. 간단히 말해서, 컴퓨터가 지수와 가수를 사용하여 이러한 유형의 숫자를 저장하는 방법을 설명합니다.

floatnum = sign * 2^exponent * mantissa

이들 각각에 대한 제한된 비트 량으로 한정된 정밀도 만이 달성 될 수있다. 숫자가 작을수록 가능한 숫자 사이의 차이가 작아집니다 (반대의 경우도 마찬가지입니다). 이 온라인 데모에서 실제 숫자 시도 할 수 있습니다.

이 동작을 인식하고 모든 부동 소수점 비교 및 ​​루프에서 중지 조건으로 사용하는 것을 피하십시오. 아래 두 가지 예를 참조하십시오.

예 : 부동 소수점 비교 완료 WRONG :

>> 0.1 + 0.1 + 0.1  == 0.3

ans =

  logical

   0

앞의 예와 같이 부동 소수점 비교를 사용하는 것은 바람직하지 않습니다. 차이의 절대 값을 취하여 (작은) 공차 레벨과 비교함으로써 극복 할 수 있습니다.

다음은 부동 소수점 숫자가 while 루프에서 정지 조건으로 사용되는 또 다른 예제입니다. **

k = 0.1;
while k <= 0.3 
  disp(num2str(k));
  k = k + 0.1;
end

% --- Output: ---
0.1
0.2

마지막 예상 루프를 놓치게됩니다 ( 0.3 <= 0.3 ).

예 : 부동 소수점 비교 완료 RIGHT :

x = 0.1 + 0.1 + 0.1;
y = 0.3;
tolerance = 1e-10; % A "good enough" tolerance for this case.

if ( abs( x - y ) <= tolerance )
  disp('x == y');
else
  disp('x ~= y');
end

% --- Output: ---
x == y

몇 가지주의해야 할 사항 :

  • 예상대로, 이제 xy 는 동등한 것으로 간주됩니다.
  • 위의 예에서 허용 오차의 선택은 임의로 수행되었습니다. 따라서, 선택된 값은 모든 경우에 적합하지 않을 수 있습니다 (특히 더 작은 숫자로 작업 할 때). 경계를 지능적으로 선택하는 것은 eps 함수, 즉 N*eps(max(x,y)) 사용하여 수행 할 수 있습니다. 여기서 N 은 문제 특정 번호입니다. 물론 허용되는 N 에 대한 합리적인 선택은 1E2 (위의 문제 N=1 에서도 충분하다.).

추가 읽기 :

부동 소수점 부정확성에 대한 자세한 내용은 다음 질문을 참조하십시오.

입력 인수가 충분하지 않습니다.

종종 MATLAB 개발자는 MATLAB의 편집기를 사용하여 코드를 작성하고 편집하며 특히 입력과 출력이있는 사용자 정의 함수를 사용합니다. 맨 위에는 최신 버전의 MATLAB에서 사용할 수있는 실행 버튼이 있습니다.

여기에 이미지 설명을 입력하십시오.

일단 개발자가 코드를 완성하면 Run 버튼을 누르기를 원합니다. 일부 기능의 경우에는 정상적으로 작동하지만 다른 사람에게는 Not enough input argumentsNot enough input arguments 오류가 표시되고 오류가 발생한 이유에 대해 의문의 Not enough input arguments 가 있습니다.

이 오류가 발생하지 않는 이유는 입력 인수가 필요없는 MATLAB 스크립트 나 함수를 작성했기 때문입니다. 실행 버튼을 사용하면 테스트 스크립트를 실행하거나 입력 인수가없는 것으로 가정합니다. 함수에 입력 인수가 필요한 경우, Not enough input argumentsNot enough input arguments 오류는 함수 내부에 입력이 들어갈 것으로 예상하는 함수를 작성한 경우 발생합니다. 따라서 Run 버튼을 누르기 만하면이 기능을 실행할 수 있습니다.

이 문제를 설명하기 위해 두 개의 행렬을 단순히 곱하는 함수 mult 가 있다고 가정 mult .

function C = mult(A, B)
    C = A * B;
end

최근 버전의 MATLAB에서이 함수를 작성하고 Run 버튼을 누르면 예상되는 오류가 발생합니다.

>> mult
Not enough input arguments.

Error in mult (line 2)
    C = A * B;

이 문제를 해결할 수있는 두 가지 방법이 있습니다.

방법 1 - 명령 프롬프트를 통해

명령 프롬프트에서 필요한 입력을 작성한 다음 작성한 입력을 사용하여 함수를 실행하십시오.

A = rand(5,5);
B = rand(5,5);
C = mult(A,B);

방법 2 - 대화식으로 편집기를 통해

Run 버튼 밑에 검은 색의 검은 색 화살표가 있습니다. 이 화살표를 클릭하면 메서드 # 1에서 본 것과 똑같이 함수를 호출하는 방법을 입력하여 MATLAB 작업 영역에서 가져올 변수를 지정할 수 있습니다. 함수 내부에서 지정하는 변수가 MATLAB 작업 공간에 존재하는지 확인하십시오.

배열 크기 변경주의

차별화 또는 통합 과 같은 MATLAB의 일부 공통 연산은 입력 데이터와 다른 요소를 갖는 결과를 출력합니다. 이 사실은 쉽게 간과 될 수 있습니다. 일반적으로 Matrix dimensions must agree 과 같은 오류가 발생할 수 있습니다. 다음 예제를 고려하십시오.

t = 0:0.1:10;        % Declaring a time vector
y = sin(t);          % Declaring a function

dy_dt = diff(y);     % calculates dy/dt for y = sin(t)

우리가이 결과를 그려보기를 원한다고 가정 해 봅시다. 배열 크기를 살펴보고 다음을 참조하십시오.

size(y) is 1x101
size(t) is 1x101

그러나:

size(dy_dt) is 1x100

배열은 하나의 요소가 더 짧습니다!

이제 시간 경과에 따른 위치의 측정 데이터가 있다고 가정하고 저크 (t) 를 계산하려는 경우, 시간 배열보다 3 요소가 적은 배열을 얻습니다 (저크가 3 번 차별화 된 위치이기 때문에).

vel = diff(y);       % calculates velocity vel=dy/dt for y = sin(t)  size(vel)=1x100
acc = diff(vel);     % calculates acceleration acc=d(vel)/dt         size(acc)=1x99
jerk = diff(acc);    % calculates jerk jerk=d(acc)/dt                size(jerk)=1x98   

그리고 다음과 같은 작업 :

x = jerk .* t;          % multiplies jerk and t element wise

행렬 차원이 일치하지 않기 때문에 오류를 반환합니다.

위와 같은 연산을 계산하려면 작은 배열 크기에 맞게 더 큰 배열 크기를 조정해야합니다. 데이터로 다항식을 구하려면 데이터로 회귀 ( polyfit )를 실행할 수도 있습니다.

치수 불일치 오류

치수 불일치 오류는 일반적으로 다음과 같은 경우 나타납니다.

  • 함수 / 메소드 호출에서 반환 된 변수의 모양에주의를 기울이지 않습니다. 많은 inbuilt MATLAB 함수에서 행렬은 벡터로 변환되어 계산 속도를 높이고 반환 된 변수는 예상 한 행렬이 아닌 벡터가 될 수 있습니다. 논리적 마스킹 이 관련된 일반적인 시나리오이기도합니다.
  • 암시 적 배열 확장 을 호출하면서 호환되지 않는 배열 크기를 사용합니다.

허수 단위, 루프 인덱스 또는 일반 변수로 "i"또는 "j"사용.

추천

심볼 ij 는 MATLAB에서 상당히 다른 것을 나타낼 수 있기 때문에 루프 인덱스로 사용하면 여러 연령대에서 MATLAB 사용자 커뮤니티가 분리됩니다. 역사적인 성능상의 이유로 인해 균형이 한쪽으로 치우치는 데 도움이 될 수는 있지만, 이제는 더 이상 선택의 여지가 없으며 선택은 전적으로 귀하와 귀하가 따라야 할 코딩 방법에 달려 있습니다.

현재 Mathworks의 공식 권장 사항은 다음과 같습니다.

  • i 는 함수이기 때문에 재정의하여 변수로 사용할 수 있습니다. 그러나 복잡한 산술에서 사용하려는 경우 변수 이름에 ij 를 사용하지 않는 것이 가장 좋습니다.
  • 복잡한 산술에서 속도와 견고성을 높이려면 ij 대신 1i1j 사용하십시오.

태만

MATLAB에서 기본적으로 문자 ij 는 내장 function 이름이며, 둘 다 복잡한 도메인의 허수 단위를 나타냅니다.

따라서 기본적으로 i = j = sqrt(-1) 입니다.

>> i
ans =
   0.0000 + 1.0000i
>> j
ans =
   0.0000 + 1.0000i

그리고 예상대로 :

>> i^2
ans =
    -1

그것들을 변수로 사용 (루프 인덱스 또는 다른 변수를 위해)

MATLAB은 내장 함수 이름을 표준 변수로 사용할 수 있습니다. 이 경우 사용 된 기호는 내장 함수를 더 이상 가리 키지 않으며 사용자 정의 된 변수를 가리 킵니다. 그러나이 방법은 일반적으로 혼동, 어려운 디버깅 및 유지 보수로 이어질 수 있으므로 권장되지 않습니다 ( 다른 예 : 기존 함수 이름과 동일하지 않음).

컨벤션 및 베스트 프랙티스를 존중하는 것이 현명하다면이 언어로 루프 인덱스로 사용하지 않아도됩니다. 그러나 컴파일러에서 완벽하게 기능 할 수 있으므로 오래된 습관을 유지하고 루프 반복자로 사용할 수도 있습니다.

>> A = nan(2,3);
>> for i=1:2        % perfectly legal loop construction
       for j = 1:3
        A(i, j) = 10 * i + j;
       end
   end

루프 인덱스는 루프의 끝에서 범위를 벗어나지 않으므로 새로운 값을 유지합니다.

>> [ i ; j ]
ans =
     2
     3

변수로 사용할 경우 사용 전에 초기화 되었는지 확인하십시오. 위의 루프에서 MATLAB은 루프를 준비 할 때 자동으로 초기화하지만 제대로 초기화되지 않으면 우연히 결과에 complex 가 나타날 수 있습니다.

나중에 내장 함수의 음영 처리를 취소해야 할 경우 (예 : ij 에서 허수 단위를 다시 나타내려면) 변수를 clear 수 있습니다.

>> clear i j

복잡한 산술에서 사용하려는 경우 Mathworks 예약을 루프 인덱스로 사용하는 것에 대해 지금 이해하고 있습니다. 귀하의 코드는 변수 초기화와 clear 명령, 가장 심각한 프로그래머 ( 예, 거기에 ...! ) 및 프로그램 사고가 발생하기를 기다리는 가장 좋은 방법으로 가득 차 있습니다.

복잡한 산술 연산이 필요하지 않으면 ij 의 사용은 완벽하게 기능하며 성능 저하가 없습니다.


가상 단위로 사용 :

코드가 complex 를 처리해야한다면, ij 는 확실히 유용 할 것입니다. 그러나 모호성을 제거하고 퍼포먼스를 위해서라도 속기 구문 대신 완전한 양식을 사용하는 것이 좋습니다. 전체 양식은 1i (또는 1j )입니다.

>> [ i ; j ; 1i ; 1j]
ans =
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i
   0.0000 + 1.0000i

그들은 같은 값 sqrt(-1) 을 나타내지 만, 나중의 형식은 :

  • 의미 론적 방법으로 더 명백하다.
  • (나중에 코드를 보는 누군가가 i 또는 j 가 변수인지 또는 허수 단위인지를 찾기 위해 코드를 읽을 필요가 없습니다).
  • 더 빠릅니다 (출처 : Mathworks).

전체 구문 1i 는 기호 앞에 오는 숫자와 함께 유효합니다.

>> a = 3 + 7.8j
a =
   3.0000 + 7.8000i

이것은 그 사이에 연산자없이 번호를 붙일 수있는 유일한 기능입니다.


함정

허수 단위 OR 변수로 사용하는 것이 완전히 합법적 인 반면, 두 가지 사용법이 혼재하면 혼란을 일으킬 수있는 작은 예가 있습니다.

i 오버라이드 (override) 해 변수로합니다.

>> i=3
i =
     3

이제 i (값 3 유지하는) 변수입니다 . 그러나 우리는 단지 허수 단위의 속기 표기법을 무시합니다. 완전한 형식은 여전히 ​​올바르게 해석됩니다.

>> 3i
ans =
   0.0000 + 3.0000i

이제 가장 모호한 공식을 만들 수있게되었습니다. 다음과 같은 모든 구문의 가독성을 평가할 수 있습니다.

>> [ i ; 3i ; 3*i ; i+3i ; i+3*i ]
ans =
   3.0000 + 0.0000i
   0.0000 + 3.0000i
   9.0000 + 0.0000i
   3.0000 + 3.0000i
  12.0000 + 0.0000i

보시다시피, 위 배열의 각 값은 다른 결과를 반환합니다. 각 결과가 유효하지만 (초기 의도가 제공된 경우), 대부분의 사람들은 그러한 구조로 가득 찬 코드를 읽는 것이 적절한 악몽이라고 인정할 것입니다.

다차원 배열에`length` 사용하기

MATLAB 코더의 공통적 인 실수는 행렬에 length 함수를 사용한다는 것입니다 ( 벡터 와는 반대). length 함수 는 문서 에서 언급 한 것처럼 입력의 " 가장 큰 배열 차원의 길이를 반환합니다 ."

벡터의 경우 length 의 반환 값은 두 가지 의미를 갖습니다.

  1. 벡터의 총 요소 수입니다.
  2. 벡터의 가장 큰 치수입니다.

벡터와는 달리, 위의 값은 두 개 이상의 비 - 싱글 톤 (즉, 크기가 1 보다 큰) 배열의 배열과 동일하지 않습니다. 이것이 행렬의 length 를 사용하는 것이 모호한 이유입니다. 대신 벡터로 작업 할 때조차도 다음과 같은 기능 중 하나를 사용하여 코드의 의도를 완벽하게 명확하게 만듭니다.

  1. size(A) - 요소에 A 의 해당 치수를 따라 요소의 양이 포함 된 행 벡터를 반환합니다.
  2. numel(A) - 요소의 수를 반환 A . prod(size(A)) 와 같습니다.
  3. ndims(A) - 배열 A 의 차원 수를 반환합니다. numel(size(A)) .

이것은 입력이 미리 알려지지 않은 "미래 보장형" 벡터화 된 라이브러리 함수를 작성할 때 특히 중요하며 다양한 크기와 모양을 가질 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow