所以,我有这个单元格数组在每个单元格中包含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维度必须同意'
提前致谢。
答案 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