搜索单元格数组中的特定矩阵

时间:2015-03-10 18:43:52

标签: matlab search matrix cell-array

所以,我有这个单元格数组在每个单元格中包含n x 2矩阵。以下是示例数据:

[16 17;17 17]
<6x2 double>
<52x2 double>
[17 17;17 18]
[17 18;17 17]

我要做的是消除重复的矩阵(具有相同值或反转值的矩阵)。在这种情况下是[17 18; 17 17](第5行),因为我们已经[17 17; 17 18](第4行)

我尝试使用唯一功能,但它说该功能仅适用于字符串。我也尝试用 cellfun 这样找到它

cellfun(@(x) x==whatToSearch, lineTraced, 'UniformOutput', false)

但是它说'Matrix维度必须同意'

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是执行您想要的代码。

mydup = rand(5,2);
mycell = {mydup;mydup;rand(7,2);rand(3,2);rand(5,2)}

myNewCell = trimCell(mycell)

trimCell的功能如下:

function myNewCell = trimCell(myCell)


exclude = false(size(myCell));
for iter = 1:size(myCell,1)
    toCompare = myCell{iter};
    comparisons = cellfun(@(x) all(size(x)==size(toCompare)) && myEquals(x, toCompare),myCell);
    % comparisons has at least 1 true in it, because toCompare==toCompare
    exclude(iter) = sum(comparisons)>1;
end

myNewCell = myCell(~exclude);

end

function boolValue = myEquals(x,y)

assert(all(size(x)==size(y)));

boolValue = true;
for iter = 1:size(x,1)
    thisRow = all(sort(x(iter,:))==sort(y(iter,:)));
    boolValue = boolValue && thisRow;
    if ~boolValue
       return 
    end

end

end

基本上,这个函数的作用是,对于单元格中的每个矩阵,它首先检查大小是否相等。如果大小不相等,那么即使我们对行重新排序,我们也知道矩阵不相等。

如果它们的大小相同,那么我们需要在行重新排序后检查它们是否相等。这是由函数myEquals完成的,它逐行进行并在比较它们之前对行进行排序。它在重新排序后找到的第一行上以false退出。

希望这有帮助, 安德鲁

答案 1 :(得分:1)

这是一个解决方案。给定矩阵的m x 1列单元格数组C,此代码将删除等效的重复项。 (这里将删除第4和第5个矩阵,相当于第1个矩阵。)

C{1} = magic(3);
C{2} = magic(4);
C{3} = magic(5);
C{4} = C{1};
C{5} = flipud(C{1});

myEq = @(A,B) isequal(A,B) | isequal(A,flipud(B)); %// equivalence operator tests for same or up-down flipped matrix
C = C(:);                                          %// ensure the cell array is a column
Crep = repmat(C,1,size(C,1));                      %// repeat cell array along rows to get a square
comp = cellfun(myEq,Crep,Crep');                   %'//get a comparison matrix by comparing with transpose
comp = tril(comp) - eye(size(comp));               %// ignore upper triangle and diagonal
idx = find( sum(comp,2)==0 );                      %// get index of matrices we want to keep
result = C(idx);                                   %// get result

输出删除第4和第5个矩阵,留下前3个magic矩阵:

>> result

result = 

[3x3 double]    [4x4 double]    [5x5 double]

>> result{1}, result{2}, result{3}

ans =

     8     1     6
     3     5     7
     4     9     2


ans =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1


ans =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9