2016-08-26 7 views
0

以下のコードを簡単にしたいと思います。関数内の配列のアドレス指定

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でbegginer午前:

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

をしかし、MATLABはこれが好きではありません。

上記のアプローチのもう一つの問題は、matlabはname(2)のようなものであってもセルタイプを与え続けますが、これは私の構文の問題かもしれません。

例ファイル名:

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

のは、私は「5S」で終わるすべてのファイルを選択したいとしましょうで、私は、'_'で(拡張子を取り除いた後)、それらを分割し、第二の部分を返す必要があります上記の3つのファイル名の場合は、0, 0, 110となります。 しかし、私は上記の複雑なコードなしで、この単純な操作をmatlabでどのように行うのが一般的なのか興味があります。

+0

例のファイル名を提供し、あなたが望む結果を説明してください。 – excaza

+0

@excaza問題を詳細に編集しました。 – leosenko

+0

例のファイル名が意図した用途に象徴的である場合、正規表現の照合によって意図した結果が得られますか? )、{files(:)。name}、 'UniformOutput'、false( 'regexp(c、 '\ _(?+?)\ _'、 'tokens'、 'once' ) '? – TroyHaskin

答えて

0

regexpを使用すると、正規表現マッチングを実行し、2番目の数字を直接取得できます。 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の主要候補です。正規表現は初めに習得するのが紛らわしいものですが、非常に強力なツールです。

は、先頭と末尾のアンダースコアの両方を持っているすべての数値を引き出し、次の例を考えてみます。

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); 

返す:ここで使用されて

nums = 

    0  0 110 

を後読み(?<=...)と呼ばれるものであり、(?=...)を先読み演算子。彼らの名前が示唆するように、私たちの場合は(\d+)という表現に関連するそれぞれの方向を見て、1つ以上の数字を探します。この方法では単純な'\_(\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); 
関連する問題