我有一个字符数组列表,并希望计算出数字向量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&2和2N? (存储在chr
) - 然后计数从0开始重新开始,以便下一个' 2' - 有5C和6N的地方。
答案 0 :(得分:3)
[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