0

私のコードは

 pathname=uigetdir;
 filename=uigetfile('*.txt','choose a file name.');
 data=importdata(filename);
 element= (data.data(:,10));
 in_array=element; pattern= [1 3];
 locations = cell(1, numel(pattern));
 for p = 1:(numel(pattern))
 locations{p} = find(in_array == pattern(p));
 end

 idx2 = [];
 for p = 1:numel(locations{1})
 start_value = locations{1}(p);
      for q = 2:numel(locations)

      found = true;

         if (~any((start_value + q - 1) == locations{q}))
         found = false;
         break;
         end

      end

    if (found)
      idx2(end + 1) = locations{1}(p);
    end

 end
[m2,n2]=size(idx2)

res_name= {'one' 'two'};
res=[n n2];

このコードでは、データファイルの列の1つでパターンを見つけ、それが繰り返される回数を数えています。

私はそれらで同じことをしたい200のファイルが好きですが、残念ながら私は立ち往生しています。

これは私がこれまでに追加したものです

 pathname=uigetdir;
 files=dir('*.txt');
 for k=1:length(files)
   filename=files(k).name;

    data(k)=importdata(files(k).name);

    element{k}=data(1,k).data(:,20);
    in_array=element;pattern= [1 3];
    locations = cell(1, numel(pattern));
    for p = 1:(numel(pattern))
    locations{p} = find(in_array{k}== pattern(p));
    end
    idx2{k} = [];

このコードを続行するにはどうすればよいですか..??

4

1 に答える 1

0

OK、最初にこの関数を定義します。

function [inds, indsy] = findPattern(M, pat, dim)

    indices = [];

    if nargin == 2 
        dim = 1;
        if size(M,1) == 1
            dim = 2; end
    end

    if dim == 1        

        if numel(pat) > size(M,1)            
            return; end

        for ii = 1:size(M,2)
            inds = findPatternCol(M(:,ii), pat);
            indices = [indices; repmat(ii,numel(inds),1)   inds]%#ok
        end

    elseif dim == 2

        if numel(pat) > size(M,2)            
            return; end

        for ii = 1:size(M,1)
            inds = findPatternCol(M(ii,:).', pat);            
            indices = [indices; inds   repmat(ii,numel(inds),1)]%#ok
        end

    else

    end

    inds = indices;
    if nargout > 1        
        inds  = indices(:,1);
        indsy = indices(:,2);
    end

end

function indices = findPatternCol(col, pat)    
    inds = find(col == pat(1));
    ii = 1;
    prevInds = [];
    while ~isempty(inds) && ii<numel(pat) && numel(prevInds)~=numel(inds)
        prevInds = inds;
        inds = inds(inds+ii<=numel(col) & col(inds+ii)==pat(ii+1));
        ii = ii + 1;
    end
    indices = inds(:);
end

これはまともですが、おそらく最も効率的ではありません。パフォーマンスが問題になる場合は、ここから最適化を開始してください。

次のように各ファイルをループします。

pathname = uigetdir;

files = dir('*.txt');
indices = cell(length(files), 1);
for k = 1:length(files)

    filename = files(k).name;    
    data(k) = importdata(files(k).name);

    array = data(1,k).data(:,20);
    pattern = [1 3];

    indices{k} = findPattern(array, pattern);

end

パターンの出現回数は、次のように見つけることができます。

counts = cellfun(@(x)size(x,1), indices);
于 2012-10-11T15:33:45.513 に答える