使用矩阵作为索引在另一个上执行函数-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.