Help with ismember, intersect functions for matching data
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hello!
I posted about this before, however the advice I got is still not helping with the problem. I wonder if anyone else might have some insight..
I am working on a program to match cell channels from two difference cell recordings. I have two lists of data, let's call one A, and the other B:
A=[1, 2, 9, 11, 14, 17, 18, 19, 32, 34, 38, 42, 42, 46, 53, 56, 57, 62, 64, 95, 96, 96];
B = [2, 5, 9, 11, 14, 17, 18 , 19, 26, 32, 34, 38, 42, 53, 56, 57, 62, 64, 65, 81, 96];
and the cell number of each is the index value.
(e.g cellA=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22]; cellB =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21];
What I need to do is determine which values are common between A and B, and return the cell number (location of this channel) so that I can plot a graph just for the common channels.
I have tried using the ismember and the intersect functions:
FIRST ATTEMPT WITH ISMEMBER:
commonA = ismember(A,B); common B = ismember (B,A); %to tell us where repeated values are
cellA=find(commonA); cellB=find(commonB); %to give the index of the repeated value
Which works great until there is a repeated number in A or B, then the indicies no longer match up - for example 42 and 96 are repeated in A, which means that there are two cells firing from each. I need to plot both of these cells against the corresponding cell with channel 42 in B. This method causes the cells to be unmatched after a repeated value.
SECOND ATTEMPT WITH INTERSECT:
[common, iA, iB]=intersect(A,B);
With intersect my indices are nicely matched, however "common" removes the repeated channels, and so I am losing data from one cell if I use this function. (e.g. if 42 occurs at positions 12 and then 13 in A, and at position 13 in B, common only sites that 13A and 13B are common, and ignores that 12A and 13B are common as well).
What I need to return are the indices of A and B for which they have the same example. These should be returned in the form:
indA = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 16, 17, 18, 19, 21, 22]
indB = [ 1, 3, 4, 5, 6, 7, 8, 10, 11, 13, 13, 14, 15, 16, 17, 18, 21, 21]
note that the trick is to keep indA(12) and indB(13) as well as indA(21) and indB(21). The intersect function removes these values and so I am missing data in my return.
Thank you in advance for your help!
2 Kommentare
Leah
am 17 Mai 2011
I've read this a few times and I don't understand what you want to happen with repeated values. Maybe if you tell me what your output should be.
From what you describe it sounds like your answer is already correct.
Akzeptierte Antwort
Matt Fig
am 17 Mai 2011
Will this do what you want? Note the requirement that A and B are sorted, which you have...
A=[1, 2, 9, 11, 14, 17, 18, 19, 32, 34, 38, 42, 42, 46, 53, 56, 57, 62, 64, 95, 96, 96]
Aidx = 1:length(A);
B = [2, 5, 9, 11, 14, 17, 18 , 19, 26, 32, 34, 38, 42, 53, 56, 57, 62, 64, 65, 81, 96]
Bidx = 1:length(B);
I = ismembc(A,B);
Aintrsct = A(I)
Aidxintrsct = Aidx(I)
For B, then do:
I = ismembc(B,A); % A must be sorted.
Bintrsct = B(I)
Bidxintrsct = Bidx(I)
%
%
%
%
%
%
EDIT Now that we have expected output...
% Data
A = [1, 2, 9, 11, 14, 17, 18, 19, 32, 34, 38, 42, 42, 46, 53, 56, 57, 62, 64, 95, 96, 96]
Aidx = 1:length(A);
B = [2, 5, 9, 11, 14, 17, 18 , 19, 26, 32, 34, 38, 42, 53, 56, 57, 62, 64, 65, 81, 96]
Bidx = 1:length(B);
% Engine
I = ismembc(A,B);
Aidxintrsct = Aidx(I)
Bidxintrsct = arrayfun(@(x) Bidx(x==B),A,'Un',0);
Bidxintrsct = [Bidxintrsct{:}]
4 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!