检查单元格中的条目是否在单元格数组中

时间:2013-01-21 02:51:36

标签: matlab cells

假设我有一个单元格

A = {[3,0], [2,1]}

和一个单元格数组

B = {[4,-1],[3,0];      
      [-1,4],[-3,5];
      [3,0],[2,1];
      [2,1],[-1,4]}.

我想找到A中的第一个或第二个条目都显示在B中的索引,不包括BA的两个条目出现的行。

在这个示例中,我应该为[1 4]中的行获取B之类的内容。我一直在尝试使用cellfuncell2mat解决这个问题,但仍然磕磕绊绊。

2 个答案:

答案 0 :(得分:0)

快速而肮脏:

C=zeros(size(B));

for i=1:size(C,1);
    for j=1:size(C,2);
        for k=1:length(A);
            C(i,j)=C(i,j)+isequal(B{i,j},A{k}); % Does element k of A match?
        end;
    end;
end;

find(sum(C')==1) % Sums the rows and finds the rows with only one match

答案 1 :(得分:0)

我会通过将我的单元格数组转换为适当尺寸的数字数组来解决此问题,然后使用ismember

以下示例说明了此方法如何对问题中的示例单元格数组起作用:

%# Build the example cell arrays
A = {[3,0], [2,1]};
B = {[4,-1],[3,0];      
     [-1,4],[-3,5];
     [3,0],[2,1];
     [3,0],[3,0];
     [2,1],[-1,4]};

%# Get the number of elements in A, and the length of the first element
K = size(A, 2);
J = length(A{1, 1});

%# Convert cell arrays to usefully shaped numerical matrices
ANumVec = cell2mat(A);
ANum = reshape(ANumVec, K, J)';
BNum = cell2mat(B);

%# Find matches of 1*2 vectors in ANum in sets of two columns of BNum 
I1 = ismember(BNum(:, 1:J), ANum, 'rows');
I2 = ismember(BNum(:, J+1:end), ANum, 'rows');
I3 = ismember(BNum, ANumVec, 'rows');

%# Find all indices where there was exactly 1 match (ie omit cases of no matches and cases of 2 matches)
MainIndex = I1 + I2;
MainIndex(I3) = 0;
Soln = find(MainIndex > 0);

有些观点:

1)此方法查找B中所有行的索引,其中A的元素位于B的第一列或第二列,不包括 AB行完全对应的情况。

2)如果A中有多行,此方法将失败。然而,A是大小为1 * N的单元阵列是稳健的,其中N表示一些任意数量的1 * 2数值向量。因此,可以通过首先将A重新整形为1 * N单元阵列来规避单行限制。

3)使用逻辑运算符==测试等效性。除非您有理由相信您的输入不会出现任何浮点错误,否则浮点数可能会很危险。

4)我无法感觉到有一种更有效的方法来解决这个问题,但我现在还没有看到它。 : - )