수색…


비고

이 주제에는 커뮤니티가 장기간에 걸쳐 습득 한 우수 사례가 표시됩니다.

줄을 짧게 유지

연속 문자 (말줄임표)를 사용하여 ... 긴 문장을 계속합니다.

예:

MyFunc( parameter1,parameter2,parameter3,parameter4, parameter5, parameter6,parameter7, parameter8, parameter9)

다음으로 대체 될 수 있습니다 :

MyFunc( parameter1, ...
        parameter2, ...
        parameter3, ...
        parameter4, ...
        parameter5, ...
        parameter6, ...
        parameter7, ...
        parameter8, ...
        parameter9)

코드를 들여 쓰기 적절하게 들여 쓰기

적절한 들여 쓰기는 미적 외관을 제공 할뿐만 아니라 코드의 가독성을 높입니다.

예를 들어 다음 코드를 생각해보십시오.

%no need to understand the code, just give it a look
n = 2;
bf = false;
while n>1
for ii = 1:n
for jj = 1:n
if ii+jj>30
bf = true;
break
end
end
if bf
break 
end
end
if bf
break 
end
n = n + 1;
end

보시다시피 어디에서 끝나는 루프 및 if 문을 볼지주의 깊게 살펴야합니다.
똑똑한 들여 쓰기로, 당신은이 모양을 얻을 것이다 :

n = 2;
bf = false;
while n>1
    for ii = 1:n
        for jj = 1:n
            if ii+jj>30
                bf = true;
                break
            end
        end
        if bf
            break
        end
    end
    if bf
        break
    end
    n = n + 1;
end

이것은 루프 / if 문의 시작과 끝을 명확하게 나타냅니다.

다음과 같이 스마트 들여 쓰기를 할 수 있습니다.
모든 코드 선택 ( Ctrl + A )
Ctrl + I 또는 클릭 SmartIndentIcon 수정 막대에서. 편집자

어설트 사용

Matlab은 사소한 오류를 자동으로 처리 할 수 ​​있습니다. 따라서 실행 오류 디버깅을 수행하는 데 오류가 발생할 수 있습니다. 당신이 당신의 변수에 대한 뭔가를 가정하면, 그것을 확인합니다.

function out1 = get_cell_value_at_index(scalar1,cell2)
assert(isscalar(scalar1),'1st input must be a scalar')
assert(iscell(cell2),'2nd input must be a cell array')

assert(numel(cell2) >= scalar1),'2nd input must have more elements than the value of the 1st input')
assert(~isempty(cell2{scalar1}),'2nd input at location is empty')

out1 = cell2{scalar1};

루프를 피하십시오.

대부분의 경우 루프는 Matlab에서 계산 상으로 비쌉니다. 벡터화를 사용하면 코드가 더 빨리 늘어납니다. 또한 코드를 모듈화하고 쉽게 수정할 수 있으며 디버그하기가 쉽습니다. 가장 큰 단점은 데이터 구조를 계획하는 데 시간을 투자해야한다는 것이고 차원 오류는 더 쉽게 나타납니다.

예제들

쓰지 마라.

for t=0:0.1:2*pi
    R(end+1)=cos(t);
end

그러나

t=0:0.1:2*pi;
R=cos(t)

쓰지 마라.

for i=1:n
    for j=1:m
        c(i,j)=a(i)+2*b(j);
    end
end

그러나

c=repmat(a.',1,m)+2*repmat(b,n,1)

자세한 내용은 벡터화를 참조하십시오.

임시 파일의 고유 이름 만들기

스크립트 또는 함수를 코딩하는 동안, 예를 들어 일부 데이터를 저장하기 위해 하나 이상의 임시 파일이 필요할 수 있습니다.

기존 파일을 덮어 쓰거나 MATLAB 함수를 섀도우하게하지 않으려면 tempname 함수를 사용하여 시스템 임시 폴더의 임시 파일에 대한 고유 한 이름 을 생성 할 수 있습니다.

my_temp_file=tempname

파일 이름은 확장자없이 생성됩니다. tempname 의해 생성 된 이름에 원하는 확장자를 연결하여 추가 할 수 있습니다.

my_temp_file_with_ext=[tempname '.txt']

tempdir 기능을 caling하여 시스템 임시 폴더의 위치를 ​​검색 할 수 있습니다.

함수 / 스크립트를 실행하는 동안 임시 파일이 더 이상 필요하지 않으면 delete 함수를 사용하여 삭제할 수 있습니다

delete 는 확인을 요구하지 않으므로 recycle 폴더에서 삭제할 파일을 이동하는 옵션을 설정 on 것이 유용 할 수 있습니다.

다음과 같이 recycle 함수를 사용하여이 작업을 수행 할 수 있습니다.

recycle('on')

다음 예제에서는 tempname , deleterecycle 함수의 가능한 사용법을 제안합니다.

%
% Create some example data
%
theta=0:.1:2*pi;
x=cos(theta);
y=sin(theta);
%
% Generate the temporary filename
%
my_temp_file=[tempname '.mat'];
%
% Split the filename (path, name, extension) and display them in a message box
[tmp_file_path,tmp_file_name, tmp_file_ext]=fileparts(my_temp_file)
uiwait(msgbox(sprintf('Path= %s\nName= %s\nExt= %s', ...
              tmp_file_path,tmp_file_name,tmp_file_ext),'TEMPORARY FILE'))
%
% Save the varaibles in a temporary file
%
save(my_temp_file,'x','y','theta')
%
% Load the varaibles from the temporary file
%
load(my_temp_file)
%
% Set the reclycle option on
%
recycle('on')
%
% Delete the temporary file
%
delete(my_temp_file)

경고

임시 파일 이름은 java.util.UUID.randomUUID 메소드 ( randomUUID )를 사용하여 생성됩니다.

MATLAB이 JVM없이 실행되면 임시 파일 이름은 다음을 사용하여 생성됩니다.
matlab.internal.timing.timing 은 CPU 카운터와 시간을 기반으로합니다. 이 경우 임시 파일 이름이 고유하지 않을 수도 있습니다.

validateattributes 사용

validateattributes 함수를 사용하여 일련의 스펙에 대해 배열의 유효성을 검사 할 수 있습니다.

따라서 함수에 제공된 입력의 유효성을 검사하는 데 사용할 수 있습니다.

다음 예제에서 test_validateattributes 함수에는 세 개의 입력이 필요합니다.

function test_validateattributes(input_1,input_2,input_3)

입력 사양은 다음과 같습니다.

  • array_1 :

    • 클래스 : double
    • 크기 : [3,2]
    • values ​​: 요소는 NaN이 아니어야합니다.
  • char_array :

    • class : char
    • value : 문자열을 비워 둘 수 없습니다.
  • array_3

    • 클래스 : double
    • 크기 : [5 1]
    • 값 : 요소는 실제 값이어야합니다.

세 개의 입력을 확인하기 위해 기능 validateattributes 다음 구문으로 호출 될 수있다 :

validateattributes(A,classes,attributes,funcName,varName,argIndex)

어디에:

  • A 는 폭력을 행사할 배열입니다.
  • classes : 배열의 type (예 : single , double , logical )
  • attributes : 입력 배열이 일치해야하는 속성 (예 : [3,2], size 배열의 [3,2], size 를 지정하기위한 크기, 배열이 NaN 값을 갖지 않도록 지정하는 nonnan )
  • funcName : 유효성 검사가 수행되는 함수의 이름입니다. 이 인수는 오류 메시지 생성시 사용되며,
  • varName : 유효성 검사중인 배열의 이름입니다. 이 인수는 오류 메시지 생성시 사용되며,
  • argIndex : 입력 목록에있는 인풋 배열의 위치입니다. 이 인수는 오류 메시지 생성시 사용되며,

하나 이상의 입력이 사양과 일치하지 않는 경우 오류 메시지가 생성됩니다.

두 개 이상의 유효하지 않은 입력이있는 경우 첫 번째 불일치가 발견되면 유효성 검사가 중지됩니다.

이것은 입력 유효성 검증이 구현 된 function test_validateattributes 입니다.

이 함수는 3 개의 입력을 필요로하기 때문에, 제공된 입력 수에 대한 첫 번째 검사는 fnction nargin을 사용하여 수행됩니다.

function test_validateattributes(array_1,char_array_1,array_3)
%
% Check for the number of expected input: if the number of input is less
% than the require, the function exits with an error message
%
if(nargin ~= 3)
   error('Error: TEST_VALIDATEATTRIBUTES requires 3 input, found %d',nargin)
end
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the first input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #1 name (only used in the generation of the error message)
%
input_1_name='array_1';
%
% INPUT #1 position (only used in the generation of the error message)
%
input_1_position=1;
%
% Expected CLASS of the first input MUST BE "double"
%
input_1_class={'double'};
%
% Expected ATTRIBUTES of the first input
%   SIZE: MUST BE [3,2]
%
input_1_size_attribute='size';
input_1_size=[3,2];
%
%   VALUE CHECK: the element MUST BE NOT NaN
%
input_1_value_type='nonnan';
%
% Build the INPUT 1 attributes
%
input_1_attributes={input_1_size_attribute,input_1_size, ...
                    input_1_value_type};
%
% CHECK THE VALIDITY OF THE FIRST INPUT
%
validateattributes(array_1, ...
                   input_1_class,input_1_attributes,'', ...
                   input_1_name,input_1_position);

%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the second input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #1 name (only used in the generation of the error message)
%
input_2_name='char_array_1';
%
% INPUT #2 position (only used in the generation of the error message)
%
input_2_position=2;
%
% Expected CLASS of the first input MUST BE "string"
%
input_2_class={'char'};
%
%   VALUE CHECK: the element must be not NaN
%
input_2_size_attribute='nonempty';
%
% Build the INPUT 2 attributes
%
input_2_attributes={input_2_size_attribute};
%
% CHECK THE VALIDITY OF THE SECOND INPUT
%
validateattributes(char_array_1, ...
                   input_2_class,input_2_attributes,'', ...
                   input_2_name,input_2_position);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the third input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #3 name (only used in the generation of the error message)
%
input_3_name='array_3';
%
% INPUT #3 position (only used in the generation of the error message)
%
input_3_position=3;
%
% Expected CLASS of the first input MUST BE "double"
%
input_3_class={'double'};
%
% Expected ATTRIBUTES of the first input
%   SIZE: must be [5]
input_3_size_attribute='size';
input_3_size=[5 1];
%   VALUE CHECK: the elements must be real
input_3_value_type='real';
%
% Build the INPUT 3 attributes
%
input_3_attributes={input_3_size_attribute,input_3_size, ...
                    input_3_value_type};
%
% CHECK THE VALIDITY OF THE FIRST INPUT
%
validateattributes(array_3, ...
                   input_3_class,input_3_attributes,'', ...
                   input_3_name,input_3_position);

disp('All the three input are OK')

다음 스크립트를 사용하여 유효성 검증 프로 시저의 구현을 테스트 할 수 있습니다.

그것은 3 개의 입력을 생성하고 무작위로, 그것들을 유효하지 않게 만든다.

%
% Generate the first input
%
n_rows=randi([2 3],1);
n_cols=2;
input_1=randi([20 30],n_rows,n_cols);
%
% Generate the second input
%
if(rand > 0.5)
   input_2='This is a string';
else
   input_2='';
end
%
% Generate the third input
%
input_3=acos(rand(5,1)*1.2);
%
% Call the test_validateattributes function with the above generated input
%
input_1
input_2
input_3
%
test_validateattributes(input_1,input_2,input_3)

다음은 validateattributes 함수에 의해 감지 된 잘못된 입력의 몇 가지 예입니다.

잘못된 입력

input_1 =

    23    22
    26    28

input_2 =

     ''

input_3 =

   0.0000 + 0.4455i
   1.2420 + 0.0000i
   0.4063 + 0.0000i
   1.3424 + 0.0000i
   1.2186 + 0.0000i

Error using test_validateattributes (line 44)
Expected input number 1, array_1, to be of size 3x2 when it is actually
size 2x2.

잘못된 입력

input_1 =

    22    24
    21    25
    26    27

input_2 =

This is a string

input_3 =

   1.1371 + 0.0000i
   0.6528 + 0.0000i
   1.0479 + 0.0000i
   0.0000 + 0.1435i
   0.0316 + 0.0000i

Error using test_validateattributes (line 109)
Expected input number 3, array_3, to be real.

유효한 입력

input_1 =

    20    25
    25    28
    24    23

input_2 =

This is a string

input_3 =

    0.9696
    1.5279
    1.3581
    0.5234
    0.9665

All the three input are OK

블록 설명 연산자

코드를 설명하는 주석을 추가하는 것이 좋습니다. 나중에 돌려받을 때 다른 사람 및 코더를 위해 도움이된다. 단일 행은 % 기호를 사용하거나 Ctrl+R 사용하여 주석 처리 될 수 있습니다. 이전에 주석 처리 된 행의 주석 처리를 제거하려면 % 기호를 제거하거나 Crtl+T .

각 줄의 시작 부분에 % 기호를 추가하여 코드 블록에 주석을 달 수 있지만, 2015a 이후의 새로운 버전의 MATLAB에서는 블록 주석 연산자 %{ code %} 를 사용할 수 있습니다. 이 연산자는 코드의 가독성을 높입니다. 코드 주석 처리 및 기능 도움말 문서화에 모두 사용될 수 있습니다. 블록을 접고 펼쳐 코드의 가독성을 높일 수 있습니다.

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

볼 수 있듯이 %{%} 연산자는 행에 단독으로 나타나야합니다. 이 줄에는 다른 텍스트를 포함하지 마십시오.

function y = myFunction(x)
%{
myFunction  Binary Singleton Expansion Function
y = myFunction(x) applies the element-by-element binary operation
specified by the function handle FUNC to arrays A and B, with implicit
expansion enabled.
%}

%%  Compute z(x, y) = x.*sin(y) on a grid:
% x = 1:10;
y = x.';

%{
z = zeros(numel(x),numel(y));
for ii=1:numel(x)
    for jj=1:numel(y)
        z(ii,jj) = x(ii)*sin(y(jj));
    end
end
%}

z = bsxfun(@(x, y) x.*sin(y), x, y);
y = y + z;

end


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