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

时间:2015-07-16 16:42:12

标签: 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

我希望能够识别特定种类的对,即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) - 可以这样做吗?有没有办法指定每次计算哪些对?

2 个答案:

答案 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',因此intersectfind(~diff(ind))将确保仅保留有效索引。然后accumarray会将所有索引与ind一起累积,以获得您想要的答案。