2014-10-31 3 views
0

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

Test Cases: 

     cA1 = {'This' {{{[1:5] true} {' '}} {'is '} false true} 'an example.'}; 
     [filtered1] = stringFilter(cA1) 
      filtered1 => 'This is an example.' 

     cA2 = {{{{'I told '} 5:25 'her she'} {} [] [] ' knows'} '/take aim and reload'}; 
     [filtered2] = stringFilter(cA2) 
      filtered2 => 'I told her she knows/take aim and reload' 

Вот что у меня есть:

%find the strings in the cArr and then concatenate them. 
function [Str] = stringFilter(in) 
Str = []; 
for i = 1:length(in) 
    %The base case is a single cell 
    if length(in) == 1 
     Str = ischar(in{:,:}); 
    %if the length>1 than go through each cell and find the strings. 
     else 
     str = stringFilter(in(1:end-1)); 
     if ischar(in{i}) 
      Str = [Str in{i}]; 
    elseif iscell(in{i}) 
      str1 = stringFilter(in{i}(1:end-1)); 
      Str = [Str str1]; 

     end 
    end 

end 

end 

Я пытался использовать «IsMember», но это не сработало. Какие-либо предложения? Мой код выводит следующее:

 filtered1 => 'This an example.' 
     filtered2 => '/take aim and reload' 

ответ

2

Вы вполне можете упростить функцию

function [Str] = stringFilter(in) 
Str = []; 
for i = 1:length(in) 
    if ischar(in{i}) 
     Str = [Str in{i}]; 
    elseif iscell(in{i}) 
     str1 = stringFilter(in{i}); 
     Str = [Str str1]; 
    end 
end 

end 

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

>> [filtered1] = stringFilter(cA1) 

filtered1 = 

This is an example. 

>> [filtered2] = stringFilter(cA2) 

filtered2 = 

I told her she knows/take aim and reload 
+0

Хорошая работа на этом! – Divakar

+0

ОК, это на самом деле имеет смысл :) Спасибо! –

1

Линия

Str = ischar(in{:,:}); 

проблема. Для меня это не имеет никакого смысла.

Вы близки к получению ответа, но сделали несколько значительных, но небольших ошибок.

Вам необходимо проверить следующие вещи: 1. Проложить по ячейкам ввода. 2. Для каждой ячейки посмотрите, является ли она самой ячейкой, если это так, вызовите stringFilter на VALUE ячейки 3. Если она не является ячейкой, а является массивом символов, то используйте ее значение VALUE как есть. 4. В противном случае, если ячейка VALUE содержит несимвольный символ, вклад этой ячейки в выходной сигнал равен '' (пробел)

Я думаю, что вы допустили ошибку, не воспользовавшись разницей между (1) и в 1}. В любом случае, вот моя версия функции. Оно работает.

function [out] = stringFilter(in) 
out = []; 

for idx = 1:numel(in) 
    if iscell (in{idx}) 
     % Contents of the cell is another cell array 
     tempOut = stringFilter(in{idx}); 
    elseif ischar(in{idx}) 
     % Contents are characters 
     tempOut = in{idx}; 
    else 
     % Contents are not characters 
     tempOut = ''; 
    end 

    % Concatenate the current output to the overall output 
    out = [out, tempOut]; 
end 

end 
+0

Это тоже имеет смысл, спасибо :) –

2

Вот различный implememntation

function str = stringFilter(in) 
if ischar(in) 
    str = in; 
elseif iscell(in) && ~isempty(in) 
    str = cell2mat(cellfun(@stringFilter, in(:)', 'uni', 0)); 
else 
    str = ''; 
end 
end 

Если это строка, вернуть его. Если это ячейка, примените одну и ту же функцию ко всем элементам и объедините их. Здесь я использую in(:)', чтобы убедиться, что это вектор строки, а затем cell2mat объединяет результирующие строки. И если тип - это что-то еще, возвращаем пустую строку. Нам нужно проверить, нет ли массива ячеек или нет, потому что cell2mat({}) имеет тип double.

+0

Я понимаю это, но cell2mat, как правило, нахмурился, так как нас не учили использовать его –

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