使用矩阵作为索引在另一个上执行函数-MATLAB

使用矩阵作为索引在另一个上执行函数-MATLAB,matlab,Matlab,我在此表格中有两个矩阵: ind= 1 1 1 1 2 2 2 2 2 3 3 type = A A B A A B A B A B A if strcmp(type(m),'A') == 1 && strcmp(type(m+1),'B') == 1 && ind(m) == ind(m+1) 我希望能够识别特定类型的配对,即a-B和B-a,但不能识别a-a。我已经能够使用以下形式的IF语句完成此操作: ind= 1 1 1 1 2 2 2 2 2 3

我在此表格中有两个矩阵:

ind=
1
1
1
1
2
2
2
2
2
3
3

type = 
A
A
B
A
A
B
A
B
A
B
A
if strcmp(type(m),'A') == 1 && strcmp(type(m+1),'B') == 1 && ind(m) == ind(m+1)
我希望能够识别特定类型的配对,即a-B和B-a,但不能识别a-a。我已经能够使用以下形式的IF语句完成此操作:

ind=
1
1
1
1
2
2
2
2
2
3
3

type = 
A
A
B
A
A
B
A
B
A
B
A
if strcmp(type(m),'A') == 1 && strcmp(type(m+1),'B') == 1 && ind(m) == ind(m+1)
等等

正如在这个IF语句中所暗示的,我需要能够计算每个索引有多少个有效对

例如,前四种类型
AABA
属于索引“1”,因为索引“1”的长度为
ind
中指定的4。这里有两个有效对A-B和B-A。A-A不是有效对

上述完整示例的期望输出为:

2
4
1
有没有一个快速简单的方法来实现这一点

编辑

如果将类型扩展为包括“C”-并且系统需要检测非唯一对,即A-B、B-A和B-B(但不包含C)-可以这样做吗?有没有办法指定每次统计哪些对?

试试以下方法:

>> arrayfun(@(x) sum(diff(type(ind == x)) ~= 0), unique(ind))

ans =

     2
     4
     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
实际上有点像。我认为它实际上并没有将代码矢量化。无论如何,我们的想法是用strfind找到
'AB'
'BA'
,然后将索引合并在一起。但是,您无法跨索引边界计算
'AB'
'BA'
,因此
查找(~diff(ind))
相交将确保只保留有效索引。然后,
accumarray
将所有索引与
ind
一起累加,得到您想要的答案。

+1非常简洁。出于兴趣,是否可以对其进行调整以寻找特定的配对?例如,如果我的类型扩展为A/B/C,我想找到A-B、B-A和B-B(因此是非唯一的对),但不包含C,那么可以这样做吗?谢谢!非常有趣和简洁的方法+1.