2015-01-28 3 views
0

4 행 3 행렬 ('mymatrix')이 있습니다. myfunc는 'mymatrix'를 입력하고 '결과'를 출력합니다. 내 스크립트에서 루프에서 myfunc를 사용하고 있습니다 (17280 시간). 그래서, 매번 syms x y z t를 다시 정의합니다. myfunc 외부에서 'syms x y z t'를 취할 수있는 방법이 있습니까? 매번 초기화 할 때까지 0.004 초가 걸립니다.함수 외부에 sym 정의하기

function result = myfunc(mymatrix) 

tic 
syms x y z t 
toc 

f = 3*x+5*y-6*z+7; 
eqn = subs(f,{x,y,z},{mymatrix(:,1)*t,mymatrix(:,2)*t,mymatrix(:,3)*t}); 

for ii = 1:4 
    result(ii,1) = solve(eq(ii)) 
end 

추신 : 나는 또한 루프를 위해 벡터화를 시도했지만 성공하지 못했습니다. 할 수 있으면 기쁠 것입니다.

+0

당신은이 함수를'17280' 번 호출했다고하셨습니다. 그리고이 함수에 대한 입력은'mymatrix'이므로,이 행렬이 어떤 종류의 루프에서 이러한 반복을 통해 변하고 있다고 가정하고 있습니다. 그래서, 제 질문은 다음과 같습니다 -'for iterations = 1 : 17280' 루프를 시작하기 전에이 '17280' 데이터 세트에 모두 액세스 할 수 있습니까? – Divakar

+0

또한,'result'를 숫자 배열로 얻거나, 출력으로서 sym 변수가 절대적으로 필요합니까? – Divakar

+0

'class (mymatrix) '란 무엇입니까? 그것은 숫자인가 상징인가? – horchler

답변

2

당신은 실행 중에 지속적으로 상징적 변수를 선언 할 수

function result = myfunc(mymatrix) 

    persistent x y z t 
    if isempty(x) 
     syms x y z t 
    end 
    ... 
end 

이 (프로파일에서 0.59 틱 0.65 틱) 내 컴퓨터에서 실행 시간에 약 10 %의 감소를 초래 . @Divakar이 코멘트에 지적 results 상징적 인 숫자와 아니므로

그러나, 대규모 성능 향상은 fsolve 또는 fzero (더 빨리 이후에만 fzero가 여기에 게시처럼 숫자 해결사로 전환하여 얻을 수 있습니다 내 컴퓨터에

function result = myfunc(mymatrix) 

    A = mymatrix*[3;5;-6]; 
    f = @(t,k) A(k,:)*t + 7; 

    N = size(A,1); 
    result(N,1) = 0; 
    for k = 1:N 
     result(k) = fzero(@(t) f(t,k),0); 
    end 

end 

는,이 기능은 상징적 인 접근 방식에 비해 30 배 빠른 0.02 틱 초에서 실행 : 및 기본적인 MATLAB 제품군의 일부)입니다.