Indexing way to look for specifc cell arrays in a cell array of cell arrays?

조회 수: 1 (최근 30일)
Hi! I have a cell array of "ordered-pair" cell arrays of strings, e.g.,
A = { {'aa','bb'}, {'cc','dd'}, {'ee','ff'} };
I'd like an indexing (i.e., not-explicitly-looping) way to return the "outer-most" indices of a single matching ordered-pair, e.g., if
X = {'cc', 'dd'};
then
whereEqual(X,A)
should return
[0 1 0].
Similarly, is there a not-explicitly-looping way to "flatten" A:
flatten(A) => {'aa', 'bb', 'cc', 'dd', 'ee', 'ff'}
Thanks for your help!
  댓글 수: 6
David Goldsmith
David Goldsmith 2011년 8월 25일
(If you're referring to my question having disappeared) but I didn't try to add my content after the fact as a comment, it was part of the original question.
Jan
Jan 2011년 8월 25일
The two problems already included in the wish-list: 1. The message disappears under some strange circumstances (something with empty lines, editing etc). 2. No notification for new comments.

댓글을 달려면 로그인하십시오.

답변 (3개)

Jan
Jan 2011년 8월 25일
A = { {'aa', 'bb'}, {'xx', 'yy'} };
B = { {'aa', 'bb'}, {'cc', 'dd'} };
function R = isMemberC(A, B)
R = false(size(A));
for i = 1:numel(A)
for j = 1:numel(B)
if isequal(A{i}, B{j})
R(i) = true;
break;
end
end
end
And according to your other thread: If a case-insensitive comparison is wanted, change the "if isequal..." line to:
function R = isMemberC(A, B)
R = false(size(A));
for i = 1:numel(A)
sizeA = size(A);
for j = 1:numel(B)
if isequal(sizeA, size(B{j}) && all(strcmpi(A{i}, B[j}))
R(i) = true;
break;
end
end
end
  댓글 수: 4
Fangjun Jiang
Fangjun Jiang 2011년 8월 25일
Yes. Why so obsessed with no-loopers? My hair straights up whenever I saw cellfun with anonymous function.
Jan
Jan 2011년 8월 25일
@David: Sometimes the most primitive implementation needs the fewest resources. An important rule is coming from the field of house economics: Never touch an item twice. In the original field, this means, that I put the dishes in the right place, if I hold them in my hands. For the programming it means, that it is efficient to reduce the number of accesses to the data. ISMEMBER involves two sortings and sorting means excessive data access. CELLFUN is a C-Mex function, which has to call MATLAB to perform the evaluation of the function handle for each cell element. And the needed mexCellMATLAB function has a lot of overhead. Therefore the CELLFUN(@isempty) is so much slower than CELLFUN('isempty'), which checks the dimensions inside the Mex function.
I'm using a lot of faster replacements for built-in MATLAB functions. You can look in my FEX submissions for some examples.

댓글을 달려면 로그인하십시오.


Fangjun Jiang
Fangjun Jiang 2011년 8월 25일
You probably need to do it using for-loops.
A = { {'aa', 'bb'}, {'xx', 'yy'} };
B = { {'aa', 'bb'}, {'cc', 'dd'} };
Index=false(size(A));
for k=1:length(A)
for j=1:length(B)
if isequal(A{k},B{j})
Index(k)=true;
break;
end
end
end

Andrei Bobrov
Andrei Bobrov 2011년 8월 25일
R = all(reshape(ismember([A{:}],[B{:}]),[],numel(A)))
OR
R = all(reshape(strcmp([A{:}],[B{:}]),[],numel(A)))
ADD
c = mat2cell(cellfun(@(x)[x{:}],[B';A'],'un',0),[numel(B);numel(A)],1)
R = ismember(c{:})';
  댓글 수: 4
David Goldsmith
David Goldsmith 2011년 8월 25일
You are right in both of your examples, Jan: Andrei's code would provide "undesired" answers. In my particular use case (example below), the cell array elements are to be taken as ordered and of immutable structure.
Example:
A = {{'DBfieldA', 'asc'}, {'DBfieldC', 'des'}}
should match neither {{'des', 'DBfieldC'}} nor {{'asc', 'DBfieldC'}}, and if
B = {{'DBfieldA', 'asc'}, {'DBfieldB', 'asc'}, {'DBfieldC', 'des'}}
then
"whereMember"(B,A) should => [1 0 1]
where as
"whereMember"(B, flatten(A)) should => [0 0 0]
Thanks, Jan, for saving me the trouble of having to check Andrei's soln. (for which I am appreciative, Andrei, don't get me wrong.)
Andrei Bobrov
Andrei Bobrov 2011년 8월 26일
mat2cell(cellfun(@(x)[x{:}],[B';A'],'un',0),[numel(B);numel(A)],1)
ismember(ans{:})

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by