2017-11-10 1 views
0

座標は、閉領域の多角形の表現を含む次のファイルを仮定:Matlabの、正規表現、負荷が

1.0 3.5 
0.9 -1.4 
-4.9 -17.9 
0.1 9.6 

-9.7 13.3 
8.9 11.2 
-6.4 0.1 
10.3 2.2 

各領域が空線で分割されたブロックで表されます。私は行列/配列に各ブロックを読み込むために正規表現を使用したいと思います。ただし、次のコード

file= fileread('test.txt') ; 
bs= regexp(file, '[\n\r]+(*)', 'tokens') ; 
bs= [bs{:}] ; 

は空BSにあなたの助けを

bs: empty 0 x 0, double 

感謝を提供します。

+1

は「動かない」の定義 - 特定のエラーを与え、間違った値と一致し、何とか知覚力となり、あなたはそれが洗濯をやって停止することはできません... – Wolfie

+0

の意図した結果である何正規表現?文字列を 'strsplit(file、 '\ r \ n \ r \ n')' – Steve

+0

@Wolfieで分割することができます:あなたのコメントをありがとう、 – justik

答えて

4

これは、私はそれを行うだろうかです:

bs = cellfun(@str2num, regexp(file,'(\r?\n){2}','split'), 'UniformOutput', false); 

だから、基本的に2つの改行する(Linux)、または2つのリターン - 改行(Windowsの場合)のいずれかの発生によって分割します。結果の各文字列はstr2numで行列に変換されます。

警告はここの順序である:それは潜在的にコードを実行することがありdangeoursようstr2numは、内部的にevalを呼び出します。たとえば、ファイルには! rm *が含まれ、それが実行されます。これを回避するには、ファイルが数字のみ、空白文字、小数点およびプラス/マイナス記号が含まれていることを確認することができます。

valid = all(ismember(file, ['0':'9' 1:32 '.+-'])); 

validtrueある場合にのみ進みます。

このコードは、各ブロックがセル内にある行列のセル配列を与えます。あなたの例のファイルの場合は、

>> celldisp(bs) 
bs{1} = 
    1.000000000000000 3.500000000000000 
    0.900000000000000 -1.400000000000000 
    -4.900000000000000 -17.899999999999999 
    0.100000000000000 9.600000000000000 
bs{2} = 
    -9.699999999999999 13.300000000000001 
    8.900000000000000 11.199999999999999 
    -6.400000000000000 0.100000000000000 
    10.300000000000001 2.200000000000000 
+0

@ルイスメンド:ありがとう、それは動作します:-) – justik

2

最初にテキストを前述の「ブロック」に分割する方がよい場合があります。

data = strsplit(fileread('test.txt'), '\n\n'); 

areas = regexp(data, '(-?\d+\.\d+)[ ]+(-?\d+\.\d+)', 'tokens'); 

これは、それぞれ2つの数字のセルを文字列として含むセルのセルにつながります。

{ { {'1.0', '3.5'} , 
    {'0.9', '-1.4'} , 
    ...   } , 
    { ... } } 

したがって、2番目のステージのセルを数値の配列に変換して行列として処理する必要があります。

areas = cellfun(@str2double, areas, 'UniformOutput', false); 

は...ところで、あなたは検索パターンに(*)に何を意図して?

+0

@ Sven:ありがとう。しかし、cellfun(@ str2double、a​​reas); Uniform出力の非スカラー、インデックス1、出力1になります。 'UniformOutput'をfalseに設定します。どのように行列に面積を変換するには? (*)が間違っていた。 – justik

+0

はい、確かに。私はコードをチェックしなかった。私の悪い...私は私の答えを編集します... –