我有两种矩阵:
ind=
1
1
1
1
2
2
2
2
2
3
3
type =
A
A
B
A
A
B
A
B
A
B
A
我希望能够识别特定种类的对,即A-B和B-A,但不能识别A-A。我已经能够使用这种形式的IF语句来做到这一点:
if strcmp(type(m),'A') == 1 && strcmp(type(m+1),'B') == 1 && ind(m) == ind(m+1)
等等。
正如在IF声明中暗示的那样,我需要能够计算出每个索引有多少个有效对。
例如,前四种类型AABA
属于索引“1”,因为索引“1”的长度为ind
中指定的长度。这里有两对有效的A-B和B-A对。 A-A不是有效的一对。
以上完整示例的所需输出为:
2
4
1
有没有快速简便的方法来实现这一目标?
修改:
如果类型被扩展为包含'C' - 并且系统需要检测非唯一对,即A-B,B-A,还有B-B(但不包含C) - 可以这样做吗?有没有办法指定每次计算哪些对?
答案 0 :(得分:1)
试试这个:
>> arrayfun(@(x) sum(diff(type(ind == x)) ~= 0), unique(ind))
ans =
2
4
1
答案 1 :(得分:1)
您可以尝试:
ind = [1 1 1 1 2 2 2 2 2 3 3]';
type = 'AABAABABABA';
accumarray(ind(intersect([strfind(type,'AB'),strfind(type,'BA')],find(~diff(ind)))),1)
输出:
ans =
2
4
1
如果我没记错的话,arrayfun
实际上就是slow。我认为它实际上不会对代码进行矢量化。无论如何,我们的想法是找到'AB'
和'BA'
与strfind
,然后将索引合并在一起。但是,您不能跨索引边界计算'AB'
和'BA'
,因此intersect
与find(~diff(ind))
将确保仅保留有效索引。然后accumarray
会将所有索引与ind
一起累积,以获得您想要的答案。