如何在matlab中获得唯一的数字对,其中两个数字之前没有在矩阵中重复

时间:2016-06-22 16:14:02

标签: matlab matrix

我有一个输入矩阵,如下所示

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不需要,因为86都会重复,

需要

13 25,因为两者都不重复

不需要

25 14,因为两者都重复了

需要

7 2,因为两者都不重复

我无法启动任何想法。任何帮助将不胜感激。

谢谢!

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