【问题标题】:MATLAB Find Strings,store in array and concatenateMATLAB查找字符串,存储在数组中并连接
【发布时间】:2017-06-13 13:53:57
【问题描述】:

我有一个 6x2 元胞数组,如下所示:

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

【问题讨论】:

  • 它们是否总是完全相同的格式?当字数大于 9 时,它们看起来如何? 'Word134_MSW'?
  • 好吧,我有一个更大的单元阵列,但为了简单起见,只发布了它的一个子集。所以我可以在第 1 列中包含其他字符串,例如“ThisWord”、“ThisandThatWord”,基本上第一列的计数可能会有所不同,但第二列的计数将始终相同。
  • 也许这个例子过于简单了。第一列格式是否总是'XXXXXXXX_MSW'? LSW 和 MSW 是唯一的选择吗?
  • 是的,格式总是一样的。是的,唯一的选择是 LSW 和 MSW。
  • 我认为它们不按顺序排列,是吗?否则每对都像数学一样简单

标签: arrays matlab find concatenation


【解决方案1】:

对于此解决方案,我们将首先使用strtok'_' 的第1 列中的字符串断开,并将第二个字符串放在C 的第三列中:

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

接下来,使用sortrows按第一列(升序)然后第三列(降序)对C的行进行排序,并使用unique在第一列中查找唯一的字符串和索引:

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'

【讨论】:

  • strtok?这是什么巫术。我在做cellfun(@(x) x(1:end-4), C(:,1), 'un', 0)
  • @AnderBiguri:是的,strtok 处理单元格数组字符巫术。
【解决方案2】:

以下方法可能有效,或者至少可能会有所帮助:

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

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多