1

ファイル名のリストであるセル配列があります。作業しやすいと思うので、それらを転置しました。今、各セルの各行を調べて、ファイル拡張子に基づいて行を削除しようとしています。最終的には、このリストをファイル名として使用してデータをインポートしたいと考えています。これは私がリストを転置する方法です

 for i = 1:numel(F);
    a = F(1,i);
    b{i} = [a{:}'];
 end;

各セルのデータを読み取ろうとするために使用しているコードは、入力が double または string 型である必要があるというエラーを表示し続けます。何か案は?

for i = 1:numel(b);
    for k = 1:numel(b{1,i});
        b(cellfun(textscan(b{1,i}(k,1),'%s.lbl',numel(b)),b))=[];
    end;
end;

前もって感謝します。

編集:これはMATLAB用です。その点ははっきりしているはずです。ありがとうブライアン。EDIT2:Fの誰が

Name      Size               Bytes  Class    Attributes
b         1x11            13986188  cell 

aは

 Name      Size             Bytes  Class    Attributes
 a         1x1             118408  cell
4

2 に答える 2

1

あなたの説明から、あなたのF配列がどのように見えるかはわかりませんが、

F = {'file1.ext1', 'file2.ext2', 'file3.ext2', 'file2.ext1'};

.ext2次のように終わるすべてのファイルを削除できます。

F = F(cellfun('isempty', regexpi(F, '\.ext2$')));

regexpicell 配列の各要素を操作する は[]、式に一致しないすべてのファイルを返します。このcellfun呼び出しは、cell 配列を論理配列に変換します。false位置は at で終わり、その他すべてのファイルに対応し.ext2ますtrueF結果の配列は、保持する必要があるファイルを返す論理インデックスとして使用できます。

于 2013-03-24T21:57:59.817 に答える
0

cellfun の使い方が間違っています。その署名は[A1,...,Am] = cellfun(func,C1,...,Cn). 最初の引数として関数を取りますが、一致する文字列のセル配列である textscan の結果を渡しています。2 番目の引数は本来あるべきセル配列ですが、ループ内で何度も呼び出すのは意味がありません。「cellfun」の仕事は、セル配列のすべてのセルに同じことをしたい場合にループを書くことです。

textscan でファイル名を自分で解析する代わりに、使用することをお勧めしますfileparts

転置ステップでセル配列を既にループしているので、そこでフィルタリングを行うのが理にかなっているかもしれません。次のようになります。

for i = 1:numel(F);
    a = F(1,i);
    [~,~,ext] = fileparts(a{:});
    if strcmpi(ext, '.lbl')
        b{i} = [a{:}'];
    end
end;
于 2013-03-24T21:52:13.120 に答える