2016-03-10 6 views
0

У меня есть массив ячеек (п-по-1 размер), содержащий обе строки и ячейки, которая выглядит примерно такMatlab найти строку в массив ячеек

{ 
{'r1'}  % -> cell content is in format 'char' 
{'r2'}  % -> cell content is in format 'char' 
{1x2 cell} % -> cell content is a cell array: [{'r1'}{'r2'}] 
{'r3'}  % -> cell content is in format 'char' 
{1x2 cell} % -> cell content is a cell array: [{'r1'}{'r3'}] 
{1x2 cell} % -> cell content is a cell array: [{'r2'}{'r3'}] 
{1x3 cell} % -> cell content is a cell array: [{'r1'}{'r2'}{'r3'}] 
... 
} 

мне нужно найти строку-индекс, где включена какая-либо строка, например 'R2'. Я обычно использую для этой цели strfind, который отлично работает, если массив ячеек имеет согласованный формат (следовательно, «char'-format» в каждой ячейке).

Можно ли применить эту функцию к структуре массива ячеек, которая отображается выше?

Спасибо!

РЕДАКТИРОВАТЬ: Приложите три изображения, показывающие структуру данных, которую я использую, поскольку я не уверен, как точно показать/объяснить иерархии и слои массива ячеек в тексте. Надеюсь, это поможет. Также найдите прилагаемый результат кода.

код используется:

change = 'r1.m'; 
srch = cellfun(@(x) strfind(x, change), strats, 'UniformOutput', false); 
stringInRow = cellfun(@(x) numel(x) == 1 || (numel(x)>1)*numel(cell2mat(x))>0, srch); 
rows = find(stringInRow); 

cell array

example of cell array within cell 5,1

last "layer" in char format

outcome in 'srch'

outcome of logical operation on srch

ответ

3

Вы можете использовать два последующих cellfun вызовов: один для выполнения поиска строки (по ячейкам), и один, чтобы оценить его

%// example data 
c{1} = 'r1';  
c{2} = 'r2';  
c{3}{1} = 'r1'; c{3}{2} = 'r2'; 
c{4} = 'r3'; 
c{5}{1} = 'r1'; c{5}{2} = 'r3'; 

%// example search 
searchForString = 'r2'; 
srch = cellfun(@(x) strfind(x, searchForString), c, 'UniformOutput', false); 
stringInRow = ... 
    cellfun(@(x) numel(x) == 1 || (numel(x)>1)*numel(cell2mat(x))>0, srch); 
       %// ^-. short-circuit scalars here ^
       %//         | 
       %// since cell2mat is valid only for cells or empty arrays 

С в результате stringInRow (найденная строка true или нет false?):

stringInRow = 

    0  1  1  0  0 

Если вы хотите явно перечислить строки, вы можете просто использовать find на булевой вектор stringInRow

>> foundStringInRows = find(stringInRow) 

foundStringInRows = 

    2  3 
+0

небольшая ошибка: похоже, вы имеете в виду использование 'c {3} {2}' второй раз вместо 'c {5} {2}'. Можете ли вы пояснить, почему поиск в этом массиве клеток возвращает этот ответ? Как я вижу, мачта будет '0 1 1 0 0', потому что' c {2} = 'r2'' и 'c {3} {2} =' r2''. Итак, почему это '0 1 0 0 1'? –

+0

Наверное, я избил вас, чтобы исправить свою ошибку (в течение 5 минут тоже :)) перед вашим комментарием. С помощью этого исправления поиск возвращает '0 1 1 0 0', как и следовало ожидать. Хороший улов, хотя! – dfri

+0

ах, действительно! Я должен был сначала обновить его! Вы слишком быстро, D –

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