2013-07-07 5 views
1

matlab에서 여러 변수를 효율적으로 정의하는 방법이 있습니까? 내가 찾은 모든 것이 내가 찾고있는 것이 아니다. 상황은 다음과 같습니다.여러 변수를 효율적으로 정의하기

parstrs = {'a','b','c'}; 
parvals = [1 2 3]; 

사실 나는 다음과 같은 효율적인 명령을 원합니다. 결과는 숫자 변수 a에 저장되어

parstrs = parvals; 

2는 b에 저장되고, 3 c에 저장되는 등

I 세포와 이렇게 열려있어 또는 구조체.

제안 사항?

더 자세한 설명 : 아래에서 언급했듯이 커브 피팅에 변수 이름 목록이 얼마나 오랫동안 사용되는지 신경 쓰지 않는 코드를 작성하고 싶습니다. 내가 발견 한 가장 좋은 방법은 다음과 같은 구조를 사용하는 것입니다 :이와

parstrs = {'a','b','c'}; 
parvals = num2cell([1 2 3]); 
partmp = {parstrs{:};parvals{:}}; 
pars = struct(partmp{:}); 

문제는 갈 거예요 구조가 같은 방식으로 편집 할 수 없다는 것입니다. 또한 eval을 사용할 수 있습니다

[a, b] = function_returning_values(); 

: 당신이 좋아하는 뭔가를 할 수

Error using setfield (line 48) 
Inputs must be either cell arrays or strings. 
+0

오류가있는 마지막 명령에 루프를 사용할 수 없습니까? –

+0

확실히. 필자는 필자가 작성한 멀티 세트 필드 함수를 가지고있다. (또한 라이트 스피드 도구 상자에 조금 더 빨라질 수도있다.) 최적화 실행시에 ode의 rhs가 1000이라고 불리는 이후 루프를 피하려고합니다. – dmbortz

+0

다른 사람들이이 문제를 겪은 경우, 제 경험상 setfield 명령을 반복하는 것이 가장 좋습니다. eval 명령을 반복하는 데 걸리는 시간은 약 1/3입니다. – dmbortz

답변

0

: 그건

pars = setfield(pars,partmp{:}); 

다음과 같은 오류가 발생합니다입니다.

+0

나는 'function_returning_values'명령 유형뿐만 아니라 eval을 사용해 보았지만 eval 명령에는 evil 루프가 필요합니다. :) 그리고 다른 방법은 변수의 유선 사양을 필요로합니다. – dmbortz

2

당신은 eval을 찾고 있지만 아마 여전히 루프를 필요 (예 당신이 긴 명령을 생성 할 수 있지만, 당신이 정말 원하는거야?) :

루프 (이 사용하지 마십시오!) :

for ii=1:numel(parvals) 
    eval([parstrs(ii) '=parvals(' ii ')']); 
end 

eval은 대부분 필요하지 않으며 권장하지 않습니다. 셀로 변경하는 것은 관리하고 사용하는 것이 훨씬 쉽습니다. 이미 벡터에 변수가 있습니다. 색인을 사용하여 검사 할 때의 문제점은 무엇입니까?

귀하의 응용 프로그램을 좀 더 자세히 설명해야합니다. 그래서 우리는 실제로 당신이 무엇을했는지 이해할 수 있습니다. 이 종류의 변수 할당을 정말로 사용하고 싶습니다. 기본 MATLAB 환경에 GUI에서 외부 변수를 내보내기위한

, 당신은 evalin로 전환, 다음과 같이 사용할 수 있습니다 :이 문자열에 맞는 간단한 스칼라, 만 가능하다

function main_gui() 

    % do your thing, generate some values 
    parvals = [1 2 3]; 

    % now is the time to export 
    give_me_my_vars({'a','b','c'}); 

    % note that the following function is nested: 
    function give_me_my_vars(parstrs) 
     for ii=1:numel(parvals) 
      evalin('base',[parstrs(ii) '=' parvals(ii)]); 
     end 
    end 
end 

. 나는 당신이 실제로 하나의 작업 공간에서 다른 작업 공간으로 (GUI 기반으로) 변수를 전환 할 것을 찾고 싶다고 생각하지만, 이것이 가능할 지 모르겠습니다.

+0

응용 프로그램은 커브 피팅과 관련이 있습니다. 나는 많은 양의 시간이라고 불릴 송덕의 오른쪽을 가지고 있으며 매개 변수가 추정 될 것입니다. 매개 변수를 추정 할 수있는 아이디어를 얻으려면 매개 변수 이름의 셀을 rhs 함수 (변수 이름 순서는 옵티 마이저의 입력 벡터 값의 순서와 일치 함)로 보냅니다. David – dmbortz

+0

그래, 이미 내 생각에 그건 내 편집을 확인한다. –

+0

나는 eval, evalin, arrayfun, cellfun 등으로 광범위하게 실험했지만, 여전히 루프가 있어야한다. arrayfun과 cellfun은 eval을 호출하는 익명의 함수를 제공하려고 할 때 범위 문제로 괴팍하게됩니다. – dmbortz

0

단일 배열의 값을 저장할 수있는 기회의 대부분 ...

x = [1 2 3]; 

을 그리고, 대신 a를 작성, x(1) 쓰기, 대신 b 쓰기 x(2) 등의

2

당신은 , 또는

parstrs = {'a','b','c'}; 
parvals = {'1' '2' '3'}; 

cellfun(@(x,y)evalin('caller', [x '=' y]), parstrs, parvals) 

를 사용할 수 있습니다 당신은 이미,이 a bit smelly입니다에 대해 불평 할 것이다 MATLAB의 코드 분석기로, 그러나

parstrs = {'a','b','c'}; 
parvals = {1 2 3}; 

parstrs = cellfun(@(x)[x ','], parstrs, 'UniformOutput', false); 
eval(['[' parstrs{:} '] = deal(parvals{:});']) 

처럼 뭔가를 할 수 있습니다. 일반적으로 eval과 친구를 사용하는 대량 정의 변수는 다른 접근 방법에 대해 생각해 봐야 할 기호입니다.

예를 들어 변수 이름을 별도로 지정하여 값을 지정할 수있는 이유는 무엇입니까? parvals(1), parvals(2) 등은 왜 충분하지 않습니까?

+0

특정 응용 프로그램은 시스템 생물학 모델에 적합한 방법과 관련이 있습니다.그리고 어떤 매개 변수가 적합 할 수 있고 어떤 매개 변수가 될 수 없는지는 자주 명확하지 않습니다. 즉, "parvals"변수의 순서와 길이는 조사되는 가설에 따라 바뀔 수 있습니다. 구조를 사용하여 잘 작동하는 루프가 있습니다. 나는 누군가가 같은 것보다 잘 작동하는 트릭을 알고 있는지보기 위해 주위를 돌고 있었다. pars.OptStr = { '알파', '베타 1', '베타 2', 'r1', 'r2', 'r3' 'I0'}}; (pars, pars.OptStr {i}, valfit (i)); end 모두에게 감사의 말씀을 전합니다! – dmbortz

0

어떻습니까? [a,b,c] = deal(1,2,3)은 어떻습니까? 아니면 지나치게 단순화하고 있습니까?

당신은과 같이 parvals에서 가져온 값으로 parstrs에서 필드 이름을 가진 구조를 만들 수 있습니다
1

는 :

parstrs = {'a', 'b', 'c'}; 
parvals = [1 2 3]; 

nValues = length(parvals); 

for iValue = 1:nValues 
    s.(parstrs{iValue}) = parvals(iValue); 
end 

구조, s, 다음과 같습니다

s = 
    a: 1 
    b: 2 
    c: 3 

그래서 대신 a = 1을 , 당신은 s.a = 1을 가졌지 만, 나는 그렇지 않다는 생각이 듭니다.

관련 문제