2014-09-11 5 views
0

У меня есть огромный вектор клеток куб.см (размер: 1xN) формы:Vectorize фильтрация на структурах MatLab клеточных

cc{1} = {'indexString1', 'str_row1col1', 'str_row1col2' } 
cc{2} = {'indexString2', 'str_row2col1', 'bighello', 'str_row1col3' } 
cc{3} = {'indexString3','str_row3col1'} 
cc{4} = {'indexString4','str_row3col1', 'helloWorld'} 

Я хочу, чтобы пройти через каждую клетку и удалить отдельные клетки, которые содержат слово «привет», например c{4}{2}. Можем ли мы это сделать, если петли не сохраняют окончательную структуру cc?

Best, Thoth.

EDIT: Из ответов и комментариев я видел, что структура ячейки налагает некоторые ограничения. Поэтому любое другое предложение хранить мои данные приветствуется. Я просто хочу сохранить все ячейки (например, 'str_row1col1', 'str_row1col2'), которые соответствуют тому же indexString * n * (например, indexString1). Я сделал это редактирование на случай, если он поможет окончательно изменить форму.

+0

Вы хотите удалить 'cc {4}' or 'cc {4} {2}'? –

+0

Извините, если это неясно, мне интересно удалить cc {4} {2}, т. Е. Специальный вызов, а не строку, которая звонит. Спасибо за ваше наблюдение, я сделал соответствующие изменения на этом посту. – Thoth

+1

Было бы легче, если бы ячейки не были вложенными. Тем не менее, векторизация сложна с ячейками ('cellfun' является более или менее циклом, поэтому он не считается векторизации) –

ответ

2

Используя регулярные выражения, вы можете получить логический массив, в котором нули представляют собой вхождения гнезда «hello» где-то во вложенной ячейке. Как @LuisMendo отметил, что это будет гораздо легче удалить ненужные клетки, если они не были вложены:

clc 
clear 

cc{1} = {'str_row1col1', 'str_row1col2' }; 
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' }; 
cc{3} = {'str_row3col1'}; 
cc{4} = {'str_row3col1', 'helloWorld'}; 

A = (cellfun(@isempty,regexp([cc{:}],'(\w*hello|hello\w*)','match'))) 

дает следующий массив:

A = 

    1  1  1  0  1  1  1  0 

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

EDIT Вот что вы можете сделать, используя цикл for. Чтобы идентифицировать интересующие слова (земля и вода, как в вашем комментарии ниже), просто добавьте их в аргумент в вызове regexp. Этот персонаж: | используется для создания своего рода списка, чтобы Matlab проверял все выражения в скобках.

Для получения дополнительной информации о регулярных выражениях обратитесь к странице this. Существует также возможность поиска регулярных выражений с чувствительностью к регистру.

Пример кода, в котором я добавил строки, содержащие землю и воду:

cc{1} = {'str_row1col1', 'earth!superman' 'str_row1col2' 'DummyString'}; 
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' }; 
cc{3} = {'str_row3col1' 'str_row3col3' 'water_batman'}; 
cc{4} = {'str_row3col1' 'str_row4col2' 'helloWorld'}; 
cc{5} = {'str_row5_LegoMan' 'str_row5col2' 'AnotherDummyString' 'Useless String' 'BonjourWorld'}; 


% With a for loop, for example: 
FinalCell = cell(size(cc,2),1); 

for k = 1:size(cc,2) 

    DummyCell = cc{k}; % Use dummy cell for easier indexing 

    % This is where you tell Matlab what words/expressions you are looking for 
    A = cellfun(@isempty,regexp(cc{k},'(\w*hello|hello\w*|earth|water)','match')); 

    DummyCell(~A) = []; % Remove the cells containing the strings/words of interest 
    FinalCell{k} = DummyCell;  
end 

Тогда вы хорошо идти. Надеюсь, это поможет!

+0

Я думаю, что смогу принять вашу логику, но как мы можем искать несколько строк? Как «привет», «земля» и «вода»? Спасибо! – Thoth

+0

Я только что отредактировал свой ответ, надеюсь, это то, что вы ищете! –

+0

@Thoth, так это сработало? –

0

Ближе всего можно я нашел:

clear all 

cc{1} = {'str_row1col1', 'str_row1col2' }; 
cc{2} = {'str_row2col1', 'bighello', 'str_row1col3' }; 
cc{3} = {'str_row3col1'}; 
cc{4} = {'str_row3col1', 'helloWorld'}; 

cc1 = [cc{:}]; 
cc1 = cc1(~strcmp('bighello',cc1)); 

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

+0

Мне интересно сохранить ту же структуру 'cc'. – Thoth

+0

, тогда я не думаю, что это возможно без цикла for. – alexmogavero

Смежные вопросы