我有一个输入矩阵,如下所示
all = [12 16;12 13;8 14;14 19;3 6;8 6;13 25;25 14;7 2];
我需要以下输出
output = [12 16;8 14;3 6;13 25;7 2];
输出的说明如下。
第一行输入,即12 16
是输出中的第一行,因为这两个数字之前从未在输出矩阵中重复过(显然)。
第二行输入,即12 13
不需要,因为第一行输出中存在数字12
,即重复
第三行输入,即8 14
是第二行输出,因为这两个数字之前从未在输出矩阵中重复过。
第四行输入,即14 19
不需要,因为输出中存在数字14
,即重复
在类似的路线上
需要3 6
,因为两者都不重复,
8 6
不需要,因为8
和6
都会重复,
13 25
,因为两者都不重复
25 14
,因为两者都重复了
7 2
,因为两者都不重复
我无法启动任何想法。任何帮助将不胜感激。
谢谢!
答案 0 :(得分:2)
一个班轮解决方案
res = all(arrayfun(@(ii) isempty(intersect(all(1:ii-1,:),all(ii,:))),1:size(all,1)),:);
<强>结果强>
res =
12 16
8 14
3 6
7 2
<强>解释强>
让我们将单行划分为更详细和记录的代码块:
%defines a function which validates for each index wheter the row is
%completely unique are not.
uniqueRowIndicator = @(ii) isempty(intersect(all(1:ii-1,:),all(ii,:)));
%finds all the unique row in the matrix
inds = arrayfun(uniqueRowIndicator,1:size(all,1));
%extracts the result from the returned indices
res = all(inds,:);
答案 1 :(得分:1)
这假定如果一行包含两个相等的值,则它们将被视为重复,因此应删除该行。
不要使用all
作为变量名称,因为它会影响函数:
A = [12 16;12 13;8 14;14 19;3 6;8 6;13 25;25 14;7 2]; % input matrix
[~, u] = unique(A.', 'first'); % unique values of linearized transposed A.
% In recent Matlab versions you an remove 'first '
M = false(flip(size(A))); % initiallize mask of values to be kept
M(u) = true; % fill values
output = A(all(M,1),:); % keep rows that only have non-repeated values
这给出了
output =
12 16
8 14
3 6
7 2