2017-09-06 8 views
0

私はこの配列を有する::MATLAB

AB01 4 7 
AB02 3 4 
AB02 2 4 
AB03 9 5 
AB01 3 3 
AB04 3 2 
AB05 4 1 
AB03 4 1 
AB05 3 4 
AB04 1 5 

Iは最小値と最大値を決定する2数個の入力を有します。私は私が最初の列のAB02AB03またはAB04の値を持つ行をしたいという意味、最初の入力n1 = 2および第2の入力n2 = 4を設定している場合たとえば、私はこのような出力が得られます:

AB02 3 4 
AB02 2 4 
AB03 9 5 
AB04 3 2 
AB03 4 1 
AB04 1 5 

I数値ではないので、AB02 - AB04からレンジング値を作成する方法は知られていません。私はあなたの助けを本当に感謝します。


編集:私はこのスクリプトを使用しようとしています、私は私の論理インデックスが適切ではない知っているが、私はこだわっています。

col1 = 3; 
fmt = repmat('%s',1,col1); 
enter cofid = fopen('Document2.txt', 'rt');de here 
filecolumn = textscan(fid, fmt, 'Delimiter', ' '); 
fclose(fid); 
FF = horzcat(filecolumn{:}); 

y1 = input('INPUT1: ') 
y = sprintf('AB%.2d',y1) 
z1 = input('INPUT2: ') 
z = sprintf('AB%.2d',z1) 
for o = y:z 
    while o == 1 
     index = find(strcmp(FF,o)) 
    end 
    ff = FF(index,:) 
end 
+1

: (1)配列 の要素の文字列 (2)範囲のチェックの数を抽出する(3)論理的インデックス付け – m7913d

答えて

1

のは、あなたのセル配列内の文字列の末尾から数字を抽出してみましょう、あなたは一般的なものを維持するために正規表現を使用することができますが、私はあなたが常に最後に2桁の数字を持っていると仮定するつもりですあなたのような4桁の文字列が示されてきたの...

% Your data 
M = {'AB01' 4 7 
    'AB02' 3 4 
    'AB02' 2 4 
    'AB03' 9 5 
    'AB01' 3 3 
    'AB04' 3 2 
    'AB05' 4 1 
    'AB03' 4 1 
    'AB05' 3 4 
    'AB04' 1 5}; 
% Extracting numbers, using cellfun to operate on each element of the cell array 
nums = cellfun(@(r)str2num(r(3:4)), M(:,1)); 
>> nums = [1 
      2 
      2 
      % ... others ... 
      4] 

は、今、私たちは、あなたが

n1 = 2; % lower bound 
n2 = 4; % upper bound 
% Create logical array, true where nums is in range [n1,n2], false otherwise  
idx = nums >= n1 & nums <= n2; 

をしたい行にアクセスするための論理的なインデックスを使用して、 Mの行を取り出すことができます参考のため

output = M(idx,:); 
>> output = 
    {'AB02' 3 4 
    'AB02' 2 4 
    'AB03' 9 5 
    'AB04' 3 2 
    'AB03' 4 1 
    'AB04' 1 5} 

、出力せずに一緒にすべてのコードは次のようなものになります:

% Input values 
n1 = 2; n2 = 4; 
% Your data stored in cell array M, get numbers 
nums = cellfun(@(r)str2num(r(3:4)), M(:,1)); 
% Get rows within range 
output = M(nums >= n1 & nums <= n2, :); 
+0

'str2num'は'を使用評価する。代わりに 'str2double'を使用してください。 –

+0

イベントは、文字列を使用してdoubleを呼び出すことをお勧めします。 x = 1(1000)。 str =文字列(x); cll = cellstr(str);チック; double(str); toc;チック; str2double(cll); toc 経過時間は0.534203秒です。 経過時間は16.009992秒です。 – matlabbit

+0

@matlabbitこれをテストするには2016b +( 'string'のために必要です)がありませんが、数値の文字列に' double'を呼び出す前に、それらのASCII値の配列が返されます...だからこの推奨はiffy – Wolfie

0

を私はあなたの代わりに、セル配列のテーブルを使用することをお勧めしてとtableread使用しますデータをインポートするTextType文字列。値の抽出は、文字列の方が少し簡単です(これは16bから始まります)。あなたが大量のデータを扱っているなら、文字列も高速です。この質問は、異なる部分問題に分割することができる

lower_bound = 2; 
upper_bound = 4; 

data = {'AB02' 3 4 
     'AB02' 2 4 
     'AB03' 9 5 
     'AB04' 3 2 
     'AB03' 4 1 
     'AB04' 1 5}; 

data = cell2table(data,'VariableNames',{'x','y','z'}); 
data.x = string(data.x); 

value = extractAfter(data.x,2); 
value = double(value); 

data = data(value >= lower_bound & value <= upper_bound,:) 

data = 

    6×3 table 

     x  y z 
    ______ _ _ 

    "AB02" 3 4 
    "AB02" 2 4 
    "AB03" 9 5 
    "AB04" 3 2 
    "AB03" 4 1 
    "AB04" 1 5