【问题标题】:Finding strings using an index - MATLAB使用索引查找字符串 - MATLAB
【发布时间】:2015-08-16 18:22:53
【问题描述】:

我有一个字符数组列表,并希望根据数字向量 chr 中保存的索引来计算子字符串出现的次数:

list =
CCNNCCCNNNCNNCN

chr =

     1
     1
     1
     1
     2
     2
     2
     2
     2
     2
     2
     2
     2
     2
     2

通常,我正在搜索相邻的字符串对,即“NN”并使用此方法:

Count(:,1) = accumarray(chr(intersect([strfind(list,'CC')],find(~diff(chr)))),1);

使用 ~diff(chr) 确保模式匹配不会跨越索引边界。

但是,现在我想匹配单个字母字符串,即 'N' - 我该如何做到这一点?上述方法意味着每个索引中的最后一个字母被遗漏并且不被计算在内。

上述示例的预期结果将是一个两列矩阵,详细说明每个索引中“C”和“N”的数量:

C     N
2     2
5     6

即索引“1”内有 2C 和 2N(存储在 chr 中) - 然后计数从 0 重新开始,下一个“2” - 其中有 5C 和 6N。

【问题讨论】:

    标签: matlab


    【解决方案1】:
    [u, ~, v] = unique(list);          %// get unique labels for list in variable v
    result = full(sparse(chr, v, 1));  %// accumulate combinations of chr and v
    

    这适用于list 中任意数量的字母、chr 中任意数量的索引,以及chr 不一定排序。

    在你的例子中

    list = 'CCNNCCCNNNCNNCN';
    chr = [1 1 1 1 2 2 2 2 2 2 2 2 2 2 2].';
    

    产生

    result =
         2     2
         5     6
    

    result的每一列关联的字母由u给出:

    u =
    CN
    

    【讨论】:

    • 非常简洁+1。 [u,~,v] 中的 ~ 在做什么?
    • ~ 只是丢弃unique 的第二个输出的一种方式。它在功能上等同于[u, x, v] = unique(list); clear x
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多