2017-06-13 44 views
2

我有一个6X2单元阵列如下:MATLAB查找字符串,存放于阵列和串联

'Word1_MSW' '1234' 
'Word1_LSW' '5678' 
'Word2_MSW' '1234' 
'Word2_LSW' '5678' 
'Word3_MSW' '1234' 
'Word3_LSW' '5678' 

我希望做的是找到所有对应的单词,并自动将它们连接起来。例如,我想查找所有Word1并将它们连接起来,这样MSW就像这样开始左边:'12345678'。然后,我想将它们存储到一个新的阵列,使得我有:

Word1 '12345678' 
Word2 '12345678' 
Word3 '12345678' 
+0

他们总是会完全一样的格式吗?当字数大于9时,它们的外观如何? ''Word134_MSW''? –

+0

嗯,我有一个更大的单元阵列,但只是简单地发布了它的一个子集。因此,我可以在第1列中添加其他字符串,例如“ThisWord”,“ThisandThatWord”,基本上第一列的计数可以不同,但​​第二列的计数总是相同。 – DeeTee

+0

也许这个例子太简单了。第一列格式是否总是“XXXXXXXX_MSW”? LSW和MSW是唯一的选择吗? –

回答

4

对于这个解决方案,在'_'使用strtok我们首先打破串在第1列,并把第二个字符串中的C第三列:

[C(:, 1), C(:, 3)] = strtok(C(:, 1), '_'); 

接下来,排序的C使用unique行通过使用sortrows和发现在第一列中的唯一字串和索引的第一列(升序),接着第三列(降序):

C = sortrows(C, [1 -3]); 
[uniqueWords, ~, index] = unique(C(:, 1)); 

最后,组中相应的第二值使用mat2cellaccumarray列,横向串连各组串与cellfun,并创建一个独特的词语串的一个新的单元阵列:

wordGroups = mat2cell(C(:, 2), accumarray(index, 1)); 
out = [uniqueWords cellfun(@(c) {[c{:}]}, wordGroups)]; 

而且结果为您的样品C

out = 

    3×2 cell array 

    'Word1' '12345678' 
    'Word2' '12345678' 
    'Word3' '12345678' 
+0

'strtok'?这是什么巫术。我正在做'cellfun(@(x)x(1:end-4),C(:1),'un',0)' –

+1

@AnderBiguri:是的,'strtok'处理字符数组巫毒教。 – gnovice

0

下可能工作前进的道路上,或者它可能至少帮助:

numOfWords = 3;  % Enter number of separate 'Words' 

for i=1:numOfWords 
    wordNum = num2str(i); 
    testWord_MSW = ['Word' wordNum '_MSW'];  % Create words to match 
    testWord_LSW = ['Word' wordNum '_LSW']; 
    matchingCell_MSW = strmatch(testWord_MSW,cellArray{1}(1:end,:)); % Find matching words 
    matchingCell_LSW = strmatch(testWord_LSW,cellArray{1}(1:end,:)); 
    concatWord = [cellArray{2}(matchingCell_MSW,:) cellArray{2}(matchingCell_LSW,:)]; % Concatenate MSW and LSW words 
    finalArray{1}(i,:) = ['Word' wordNum]; 
    finalArray{2}(i,:) = concatWord; 
end