2011-11-20 4 views
0

Octave에서 프로그램을 작성하고 있는데 문제가 발생했습니다. Gauss-Legandre 구적법을 구현했으며 Gauss-Legandre 함수에 몇 가지 인수를 전달하고 함수를 전달합니다. 세포 큐브, 그래서 나는 한 번에 몇 가지 기능을 전달할 수 있습니다. 이 코드는 다음과 같습니다.Matlab/Octave 함수 핸들러와 Nargin

for weight=1:length(w) 
     temp=1; 
     for fun=1:length(c) 
      %liczenie iloczynu f(x_i)g(x_i), x_i - pieriwastki wielomianu Legandra 
      f=c{fun}; 
      nargin(func2str(c{fun})) 
      if (nargin (func2str(c{fun})) == 1) 
       disp('a'); 
       temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2); 
      else 
        (b-a)/2 * x(weight) + (a+b)/2; 
       temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points); 
      end 
     end 
     %mnozenie wyniku przez odpowiedni wspolczynnik - wage 
     temp*=w(weight); 
     result+=temp; 
    end 

셀 배열에는 통합하려는 함수에 대한 함수 핸들러가 있습니다. 함수가 취하는 인수의 수에 따라 함수에 두 개의 다른 호출을 사용하려고합니다.

function result=a(x) 
    result=x*x 
    end 

: 셀 어레이의 경우 내 옥타브 작업 디렉토리의 모든 것이 잘 작동하지만 내가 옥타브의 기능을 정의 할 때, 예를 들어, 실행 시간과 같은 디렉토리에하는 ​​.m 파일에 기록되는 함수에 대한 핸들러가있다

c{1}[email protected] 

를 입력하고 제 기능이 세포 배열을 전달 Kwadratury 왜 그와 내가 그것을 해결, 그렇게 할 수있는 방법 나는 F를 정의 할 수있다

error: nargin: invalid function 
    error: called from: 

nargin의 오류가 .m 파일뿐만 아니라 Octave에서도 사용할 수 있습니다.

답변

0

나는 해결책이 있다고 생각하지만, 이것은 옥타브에만 한정되어 있으며 주로 MATLAB에 익숙하기 때문에 마일리지가 다를 수 있습니다.

문자열 인수를 제공하여 nargin 함수를 호출하면 nargin이 인수를 확인하고 인수를 확인해야 함을 의미합니다. 함수를 인라인으로 선언하면 해당 함수가 해당 범위 (즉, 기본 범위) 내에 정의되므로 함수 이름을 해석하면 함수 내에서 작동하지 않습니다 (또는 내장 함수로 해석 될 수도 있습니다. 더 나쁜 행동).

가장 좋은 해결책은 nargin(func2str(c{fun})) 대신 nargin(c{fun})을 사용하는 것입니다. 그렇게하면 실제 함수 핸들을 전달할 수 있으므로 함수 이름을 실제 함수로 해석 할 필요가 없으므로 모호성이 없습니다.

일반적으로 함수를 전달하기 위해 문자열을 사용하지 않는 것이 좋습니다. 함수 핸들이 MATLAB에 포함 된 이유는 코드 (또는 정적 코드 분석 도구)를 읽는 모든 사용자가 함수를 사용하여 작업하는 것을 이해할 수 있습니다. 문자열을 사용할 때 모든 것이 모호 해집니다. 문자열 'a'a 함수 또는 알파벳의 첫 번째 문자를 참조합니까?

인라인 함수를 사용하는 것과 관련하여 Octave가 이것을 지원하는지 여부는 알 수 없지만 함수가 매우 간단하다면 익명의 함수 (예 : a = @(x)(x*x);)를 정의하는 것이 더 쉽습니다. 이것은 MATLAB이 지원하는 구조이기 때문에 코드를 다른 환경으로 이식성있게 만듭니다 (물론 X *= AX = X * A;으로 대체해야 MATLAB과 호환 될 수 있습니다).

편집 : 또 다른 가능성은 단지 여러 매개 변수와 형태의 작동 여부를 시도하고 필요한 경우 하나 개의 매개 변수 형태로 다시 떨어질 수 :

try 
    (b-a)/2 * x(weight) + (a+b)/2; 
    temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points); 
catch ME 
    try 
     disp('a'); 
     temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2); 
    catch ME 
    end 
end 

당신은 반환 여부를 확인 할 수 있습니다 오류 ME은 실제로 다른 인수를 허용하기 위해 잘못된 수의 인수가 사용되었다고 말합니다.나는 이것이 추악한 해결 방법이라는 것을 인정하지만, Octave는 분명히 nargin에 대한 함수 핸들을 지원하지 않기 때문에 인라인 함수에 대해 원하는 것을 얻을 수있는 유일한 방법 일 것입니다.

+0

옥타브 nargin이 문자열 만 받아들이 기 때문에 func2str을 사용하기 시작했는데 어쨌든 내 매개 변수가 다른 셀을 사용하여 내 문제를 해결하여 내 함수가 3 개의 변수를 받아 들일 때 C {fun , 2} 그리고 다른 것들을 포함하고 있으며 모든 기능을 별도의 파일에 담아 스코프와 관련하여 걱정할 필요가 없습니다. – Andna

+0

이전에 말했듯이, 모든 기능을 자체 파일로 유지함으로써 문제를 해결했지만, 인라인 함수는 내 코드 테스트 속도를 높이는 데 필요했지만 관리하지는 않았지만 감사합니다 :). – Andna

관련 문제