Сканирование данных из массива ячеек и удаление на основе расширений файлов

У меня есть массив ячеек, который представляет собой список имен файлов. Я переставил их, потому что мне с ними легче работать. Теперь я пытаюсь просмотреть каждую строку в каждой ячейке и удалить строки на основе их расширения файла. В конце концов, я хочу использовать этот список в качестве имен файлов для импорта данных. Вот как я транспонирую список

 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 

в то время как для

 Name      Size             Bytes  Class    Attributes
 a         1x1             118408  cell

person Omid Talaee    schedule 24.03.2013    source источник
comment
Хорошо, я добавил тег Matlab к вашему вопросу. Это поможет привлечь нужных людей к просмотру.   -  person Brian Rogers    schedule 25.03.2013
comment
Не могли бы вы добавить в свой пост результат ввода whos F в командной строке, а также whos a после запуска вашего кода?   -  person grantnz    schedule 25.03.2013


Ответы (2)


Из вашего описания я не уверен, как выглядит ваш массив F, но предполагаю

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

вы можете удалить все файлы, заканчивающиеся на .ext2, следующим образом:

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

regexpi, который работает с каждым элементом в массиве ячеек, возвращает [] для всех файлов, не соответствующих выражению. Вызов cellfun преобразует массив ячеек в логический массив с false в позициях, соответствующих файлам, оканчивающимся на .ext2 и true для всех остальных. Полученный массив можно использовать как логический индекс для F, который возвращает файлы, которые следует сохранить.

person erikced    schedule 24.03.2013

Вы неправильно используете мобильное приложение. Его подпись [A1,...,Am] = cellfun(func,C1,...,Cn). Он принимает функцию в качестве первого аргумента, но вы передаете ей результат textscan, который представляет собой массив ячеек совпадающих строк. Второй аргумент — это массив ячеек, каким он и должен быть, но нет смысла вызывать его снова и снова в цикле. Работа `cellfun' состоит в том, чтобы написать цикл для вас, когда вы хотите сделать то же самое с каждой ячейкой в ​​массиве ячеек.

Вместо того, чтобы самостоятельно анализировать имя файла с помощью textscan, я предлагаю вам использовать fileparts

Поскольку вы уже перебираете массив ячеек на шаге транспонирования, может иметь смысл выполнить фильтрацию там. Это может выглядеть примерно так:

for i = 1:numel(F);
    a = F(1,i);
    [~,~,ext] = fileparts(a{:});
    if strcmpi(ext, '.lbl')
        b{i} = [a{:}'];
    end
end;
person Kleist    schedule 24.03.2013