2014-12-03 3 views
1

dat이라는 MATLAB 구조가 있습니다. dat의 이름을 기존 문자열로 바꾸고 싶습니다.기존 문자열을 사용하여 MATLAB에서 구조체 이름 바꾸기

Existing_str='NewName' 
$(Existing_str)=dat 

이 방법으로 MATLAB에서 달러 기호를 사용할 수 있다고 생각하지 않기 때문에 실패합니다. 아래의 코드는 문자 그대로 Existing_str이라고 불리는 dat의 복사본을 생성하고 프로세스에서 Existing_str을 소멸시킵니다.

Existing_str=dat 

아래 코드는 분명히 복사본이 아닌 collosal empty 구조를 생성하지만!

eval(Existing_str)=dat 

나는 실제로 수행하려고하는 작업에서 솔루션이 아니기 때문에 미리 existing_str의 이름을 모릅니다.

+0

실제 작업이 무엇인지 알려주시겠습니까? 이와 같은 변수의 이름을 바꾸는 좋은 이유는 거의 없으며,'eval'을 많이 사용하고 있다면 미래에 더 많은 일을 할 가능성이 높습니다. – nkjt

+0

@nkjt 필자는 netcdf 파일을로드 할 때 필요한 데이터를 골라서 dat이라고하는 구조의 여러 배열에 집어 넣습니다.그런 다음 다음 번에 많은 데이터를로드 할 때 덮어 쓰기를 방지하기 위해 구조의 이름을 바꾸고 싶습니다. –

답변

2

거의 '평가판'이있었습니다. 원하는 내용은 다음과 같습니다.

eval([Existing_str '=dat;']); 

대괄호 안에 문자열을 작성했기 때문에 효과가 있습니다. 결과 문자열을 살펴 본다면 NewName=dat;처럼 보일 것입니다. eval 명령은 명령 행에 입력 한 것처럼 문자열을 평가하도록 명령을 내립니다.

+0

설명해 주셔서 감사합니다. 굉장히 유용하다. –

+2

이 질문에 답해 주지만 초심자에게 '평가'에 관해 가르치는 것이 좋다고 생각하지 않습니다. 진짜 질문은 왜 당신이 변수의 이름을 바꾸고 싶어하는지, 같은 결과를 얻는 더 좋은 방법이 있다는 것입니다. 예를 들어's. (name) = dat'을 할 수 있습니다.'s'는'struct'입니다. –

+0

@BasSwinckels 구조체의 이름을 바꾸려고합니다. 나는 그것이 틀릴 수도 있지만 이것은 변수라고 생각하지 않습니다. 왜냐하면 나는 초기 인스턴스에서 dat이라고 불리는 여러 구조체를 생성 할 것이고 원본을 저장하려고하기 때문이다. –

0

당신은 동적 필드 이름 (바스의 제안을)를 사용하고, 피할 수 eval :

예를 들어

, 당신은 단지 일부 사용자 지정 분석 기능으로 파일 'somefile.ext'에서 구조 dat를로드 한 경우 :

filename = 'somefile.ext'; % presume you actually have a list of files from dir or ls 
dat = yourfunction(filename); 
[~, name, ~] = fileparts(filename); 
alldat.(name)=dat; 

이것은 다음과 같습니다 :

alldat.somefile = dat; 

f ilename (이 경우 경로/확장자를 제거하면되지만 파일 이름의 패턴에 따라 다른 작업을 수행 할 수 있습니다).

names = fieldnames(alldat) 
for n = 1:length(names) 
    alldat.(names{n}).mean = mean(alldata.(names{n}).size); 
end 

모든 하위 구조 :

이의 보너스는 서브 필드가 모두 필드 alldat.file1, alldata.file2, alldat.file3, 말, size이 같은 일을 할이있는 구조로, 그건 당신이 말하고 할 수있다 이제 데이터의 평균을 포함하는 mean 필드가 있습니다. 이름이 다른 여러 구조가있는 경우 eval까지 모두에게 필요한 모든 것을 필요로하며 코드를 읽고 유지하기가 어려워집니다.

다른 옵션은 셀 배열입니다. 여기에 쉬운 트릭는 다음과 같습니다

dat = % whatever you do to make this structure 
alldat{end+1} = dat; 

이것은 단지 기존의 셀 어레이의 마지막에 새로운 dat을 추가합니다. {end+1}은 기존 데이터를 덮어 쓰지 않도록합니다.

+0

이것은 정확히 내가 정말로 기본적인 방식으로 질문하는 이유입니다. 나는 그것을 여러 번 읽었으며, 내가하는 일과 관련이 없거나 전혀 도움이되지 않는다고 확신하지만 의미하는 바를 이해하고 있습니다. 나는 좋은 질문을 할만 큼 충분히 대답 할 수없고 대답에 혼란 스럽다. –

+0

나는 당신이 내가 단지 파일을 읽는 것 같아 보인다. 나는 구체적인 수학적 개념 (예 : 배열의 최대 값, 변수의 값)을 선택하고이 값들 각각을 벡터 배열에 넣습니다 (예 : RH라는 변수의 최대 값이 dat.RH_max로갑니다.)) 원래 파일 이름은 나에게 흥미가 없다. 'commonstring'+ str2num (number) 형식이다. 나는이 점을 유용하게 사용할 수있을 정도로 명확하게 표현하지 못했지만이 대답이 왜 도움이되지 않는지 설명하려고했습니다. –

관련 문제