2014-09-11 4 views
0

나는 거대한 세포 벡터 CC가벡터화 필터링

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의 최종 구조를 유지하는 루프없이이 작업을 수행 할 수 있습니까?

최고, 토트.

편집 : 답변 및 의견에서 셀의 구조에는 몇 가지 제한이 있습니다. 따라서 내 데이터를 저장하는 다른 제안은 환영합니다. 동일한 indexString * n * (예 : indexString1)에 해당하는 모든 셀 (예 : 'str_row1col1', 'str_row1col2')을 함께 유지하기 만하면됩니다. 최종 수정에 도움이되도록 편집했습니다.

+0

'cc {4}'또는'cc {4} {2}'을 (를) 제거 하시겠습니까? –

+0

불명확하면 죄송합니다. cc {4} {2}를 제거하고 싶습니다. 즉, 벨롱이 아닌 행을 구체적으로 호출하는 것입니다. 관찰 해 주셔서 감사합니다. 게시물을 적절하게 변경했습니다. – Thoth

+1

셀이 중첩되어 있지 않은 것이 더 쉽습니다. 그래도 셀을 벡터화하는 것은 어렵습니다 ('cellfun'은 더 많은 또는 덜 루프이므로 벡터화로 계산되지 않습니다) –

답변

2

정규식을 사용하면 중첩 된 셀 어딘가에서 'hello'단어의 발생을 0으로 나타내는 논리 배열을 얻을 수 있습니다. @LuisMendo는 지적들이 중첩되지 않은 경우,이 원하지 않는 세포를 제거하는 것이 훨씬 쉬울 것 :

A = 

    1  1  1  0  1  1  1  0 

나는 당신이 필요 거라고 생각 나머지 부분 :

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'))) 

는 다음과 같은 배열을 제공합니다 중첩 된 셀이 모두 동일한 크기가 아니기 때문에 루프가 반복됩니다. 아무리해도 나는 그것이 당신을 조금 도와주기를 바란다.

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

나는 당신의 논리를 채택 할 것이지만 어떻게 여러 문자열을 검색 할 수 있습니까? 'hello', 'earth', 'water'처럼요? 고마워요 !! – Thoth

+0

방금 ​​내 대답을 편집 했으므로 잘하면이게 당신이 찾고있는 것입니다! –

+0

@ 그와 같이 작동합니까? –

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)); 

이 한 차원 배열로 배열을 재구성하며 정규 표현식과 일치하지 수 있지만 전체 단어.
더 나은 일을하기 위해 당신은 for 루프를 사용해야 만합니다.

+0

나는 'cc'와 같은 구조를 유지하려고한다. – Thoth

+0

그러면 for 루프 없이는 가능하지 않다고 생각합니다. – alexmogavero