2015-07-16 1 views
1

У меня есть две матрицы в таком виде:Используя матрицу в качестве индекса для выполнения функций на другой - 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 

Я хочу, чтобы иметь возможность идентифицировать пары определенного вида т.е. AB и BA, но не АА , Я смог сделать это с использованием операторов IF в таком виде:

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

И так далее.

Как намекнул на этот оператор IF, мне нужно уметь подсчитывать, сколько действительных пар есть для каждого индекса.

Например, первые четыре типа AABA относятся к индексу '1', поскольку индекс '1' имеет длину 4, как указано в ind. Здесь есть две допустимые пары A-B и B-A. A-A не является допустимой парой.

Нужный выход для полного вышеприведенного примера:

2 
4 
1 

Есть быстрый и простой способ для достижения этой цели?

EDIT:

Если типы были расширены, чтобы включить «C» - и система должна обнаружить неуникальным пар, т.е. AB, BA, но и ВВ (но ничего не содержащий C) - это могло быть сделанный? Есть ли способ указать, какие пары подсчитываются каждый раз?

ответ

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 для ответа, который вы хотите.

+0

Спасибо! Очень интересный и лаконичный подход. +1 – AnnaSchumann

1

Попробуйте это:

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

ans = 

    2 
    4 
    1 
+0

+1 Очень краткий. Из интереса, может ли это быть адаптировано для поиска конкретных пар? Например, если мои типы были расширены до A/B/C, и я хотел найти A-B, B-A и B-B (таким образом, не уникальную пару), но ничего не содержащее C, можно ли это сделать? – AnnaSchumann

Смежные вопросы