함수 가 있고 스크립트 인 f()
에서 사용하고 싶다고 가정 my_file.m
합니다.
- 함수를에 정의 할 수
my_file.m
있습니까? - 그렇지 않은 경우
f.m
. 어떻게 부르my_file.m
나요?
온라인 설명서를 읽었지만이를 수행하는 가장 좋은 방법이 무엇인지 명확하지 않았습니다.
함수 가 있고 스크립트 인 f()
에서 사용하고 싶다고 가정 my_file.m
합니다.
my_file.m
있습니까?f.m
. 어떻게 부르 my_file.m
나요?온라인 설명서를 읽었지만이를 수행하는 가장 좋은 방법이 무엇인지 명확하지 않았습니다.
답변:
R2016b 릴리스부터 다음 과 같이 스크립트에 로컬 함수 를 사용할 수 있습니다 .
data = 1:10; % A vector of data
squaredData = f(data); % Invoke the local function
function y = f(x)
y = x.^2;
end
R2016b 릴리스 이전에는 MATLAB 스크립트 내에서 정의 할 수있는 유일한 함수 유형은 익명 함수 였습니다. 예를 들면 :
data = 1:10; % A vector of data
f = @(x) x.^2; % An anonymous function
squaredData = f(data); % Invoke the anonymous function
익명 함수는 단일 표현식으로 정의되어야하므로 간단한 작업에 더 적합합니다. 더 복잡한 함수의 경우 자체 파일에서 정의하고 MATLAB 경로의 어딘가에 배치 하여 스크립트에 액세스 할 수 있도록 한 다음 다른 함수와 마찬가지로 스크립트에서 호출해야합니다.
이 제한을 극복하는 방법은 스크립트를 인수가없는 함수로 바꾸는 것입니다 (전역 네임 스페이스의 변수가 필요한 경우 함수에 명시 적으로 전달하거나 "evalin"을 사용하여 가져옵니다).
그런 다음 "스크립트"에서 필요한 모든 추가 기능을 정의 할 수 있습니다. 해킹이지만 몇 가지 사소하지 않은 기능이 필요한 경우 매우 강력하다는 것을 알았습니다.
편집 : 여기에 단순한 예가 있습니다. 이 모든 것이 단일 파일에있을 수 있습니다.
function [] = myScriptAsAFunction()
img = randn(200);
img = smooth(img);
figure(1);
imagesc(img);
axis image;
colorbar;
end
function simg = smooth(img)
simg = img / 5;
end
assignin
. 더 많이 사용할 수있는 깔끔한 기능입니다!
다음과 같이 할 수 있습니다 (파일 이름이이라고 가정 my_file.m
).
function my_file
%script here
end
function out = f(in)
%function here
end
실행 버튼을 클릭하면 my_file
기본적으로 기능 이 실행됩니다.
1) 스크립트 안에 함수를 중첩 할 수 없습니다.
2) fm이 경로 또는 현재 디렉토리에 있는지 확인하고 다른 함수처럼 호출 할 수 있습니다.
f
스크립트 (예제)에서 함수 ( 예제)를 호출 할 수도 있습니다 my_file
.
John의 솔루션을 구현 했으며 유용하다는 것을 알았습니다. 그러나 몇 가지주의 사항이 있습니다 (Octave에서는 Matlab이 유사하게 작동 할 수 있음).
clear all
보조 기능을 사용하기 전에 주 기능 내부에 코드가 포함되어 있으면 작동하지 않습니다. 파일 test3.m
에서 주석 달기 / 주석 제거 clear all
는 코드가 작동하거나 작동하지 않게 만듭니다.
function [] = test3()
%clear all
a = myfunc( 1 );
a
endfunction;
%---------------------------------
% Auxiliary functions
function retval = myfunc( a )
retval = 2 * a;
endfunction;
스크립트를 실행하면 함수 외부의 코드가 실행되고 (이 경우에는 해당 코드가 없음) 정의 된 함수 (이 경우 test3
및 myfunc
)가 작업 공간에 추가 되는 첫 번째 패스가있는 것 같습니다 . 두 번째 패스는 메인 기능을 실행하며이 기능 은 활성 상태 myfunc
인지 찾지 않습니다 clear all
.
chessofnerd가 지적한 것처럼 기본 함수의 변수는 작업 공간으로 이동하지 않습니다.