2016-08-26 2 views
0

다음 코드를 더 간단하게 만들고 싶습니다. 이 좋아하지 않는함수에서 배열 주소 지정

name = str2num(strsplit(strsplit(files(i).name,'.')(1),'_')(2)); 

하지만 MATLAB :

files=dir('~/some*.txt'); 
numFiles=length(files); 
for i = 1:numFiles 
    name=files(i).name; 
    name=strsplit(name,'.'); 
    name=name{1}; 
    name=strsplit(name, '_'); 
    name=name(2); 
    name = str2num(name{1}); 
    disp(name); 
end 

나는 내가 좋아하는 일을 사랑하는 것입니다 일반적으로 matlab에있는 초심자,입니다.

위의 접근법의 또 다른 문제는 matlab에서 name (2)과 같은 셀 유형을 제공하지만 내 구문에만 문제가있을 수 있다는 것입니다.

예 파일 이름 :

3000_0_100ms.txt 
3000_0_5s.txt 
3000_110_5s.txt 
... 

의이 '_'에 의해 (확장을 제거한 후) 그때 내가 그들을 분할해야 '5 초'로 끝나는 모든 파일을 선택하고 싶은 말은과에, 두 번째 부분을 돌려 보자 위의 세 파일 이름의 경우는 0, 0, 110입니다. 하지만 나는 이상한 복잡한 코드없이 matlab에이 간단한 작업을 수행하는 일반적인 호기심에 빠져있다.

+0

예를 들어 파일 이름을 제공하고 원하는 결과를 설명해주십시오. – excaza

+0

@excaza 질문을 세부 사항과 함께 편집했습니다. – leosenko

+0

예제 파일 이름이 의도 한 용도를 상징하는 경우 일반 표현 일치가 의도 한 결과를 제공합니까?), {files (:). name}, 'UniformOutput', false ('regexp (c, '\ _ (? +?) \ _', 'tokens', 'once')'? – TroyHaskin

답변

0

을 사용하면 정규식 일치를 수행하고 두 번째 자리에서 직접 숫자를 얻을 수 있습니다. This은 내가 사용중인 정규 표현식에 대한 설명입니다.

>>names = regexp({files(:).name},'\d*_(\d*)_\d*m?s\.txt$','tokens') 
>>names = [names{:}]; % Get names out of their cells 
>>names = [names{:}]; % Break cells one more time 
>> nums = str2double(names); % Convert to double to obtain numbers 
+1

'regexp'는 기본적으로 셀 배열에서 작동하기 때문에'cellfun'을 사용할 필요가 없습니다. – excaza

+0

@excaza 글쎄, 레벨 색인을 붕괴시키기가 쉽다.'regexp'는 당신이 게으르다는 것을 좋아한다. 판단 할 필요가 없다. – TroyHaskin

+0

감사합니다. @excaza! 내 대답이 업데이트되었습니다. –

0

파일 이름이 특정 패턴을 따르므로 regular expression의 주요 후보입니다. 정규 표현식은 처음에는 배우기가 혼란 스럽지만 매우 강력한 도구입니다. lookbehind (?<=...)(?=...)을 내다을 무엇이라고 여기에 사용되는

nums = 

    0  0 110 

:

filenames = {'3000_0_100ms.txt', '3000_0_5s.txt', '3000_110_5s.txt'}; 
strs = regexp(filenames, '(?<=\_)(\d+)(?=\_)', 'match'); 
strs = [strs{:}]; % Denest one layer of cells 

nums = str2double(strs); 

반환

은 모두 선행 및 후행 밑줄이있는 모든 숫자를 꺼내서 다음의 예를 살펴 보자 연산자. 그들의 이름에서 알 수 있듯이, 우리가 속한 표현과 관련된 각각의 방향, 하나 이상의 숫자를 찾는 우리의 경우 (\d+)을 봅니다. 이 방법은 단순한 '\_(\d+)\_' 표현식보다 많은 단계가 필요하지만, 후자는 MATLAB의 'tokens' regex 연산자를 사용하여 다른 셀 레이어를 추가하고 나를 귀찮게합니다. 또는 'match' 연산자를 사용하고 변환하기 전에 밑줄을 제거해야합니다 숫자 값.

접근법 2 :

filenames = {'3000_0_100ms.txt', '3000_0_5s.txt', '3000_110_5s.txt'}; 
strs = regexp(filenames, '\_(\d+)\_', 'tokens'); 
strs = [strs{:}]; % Denest one layer of cells 
strs = [strs{:}]; % Denest another layer of cells 
nums = str2double(strs); 

접근 방법 3 :

filenames = {'3000_0_100ms.txt', '3000_0_5s.txt', '3000_110_5s.txt'}; 
strs = regexp(filenames, '\_(\d+)\_', 'match'); 
strs = [strs{:}]; % Denest one layer of cells 
strs = regexprep(strs, '\_', ''); 
nums = str2double(strs);