检查矩阵元素是否都不相等或不同

时间:2013-07-01 20:20:28

标签: matlab

我有以下向量v = [r1 r2 r3 r4 r5 .... rn]r整数。

我想查一下:

如果r1不等于r2不等于r3 ...不等于rn(彼此不同):
   print v

else(某些元素相等,其他元素不相等):
   打印相等元素的索引。

3 个答案:

答案 0 :(得分:3)

我建议使用unique命令。它将返回所有唯一值的值。

如果您想检查矩阵v中的所有值是否唯一,我会使用以下命令:

everything_is_unique = length(unique(v))==length(v);

您还可以返回相等元素的索引。 有关详细信息,请参阅the documentation on unique

答案 1 :(得分:2)

替代使用unique,您还可以对元素进行排序并检查它们是否完全不同:

all(diff(sort(v)))

通过使用具有更多输入参数的排序,您可以获得您正在寻找的索引。

答案 2 :(得分:2)

我将再给出一个解决方案,并对目前为止尝试的所有方法进行比较。

我的解决方案基于以下观察:当使用sort()unique()等内置函数时,您将失去早期逃脱的机会。也就是说,sort()必须先对矢量完全进行排序,然后才能继续使用算法,即使在{{1}内部已检测到两个相等的值时也不需要这样做}。

因此,我只是遍历数组,并使用sort将当前值与所有后续值进行比较。这解决了其中一些问题,并且适用于很多情况。

然而,最坏情况的复杂性是 O(N²),这比any()还要差很多,sort()只有 O(N·log(N) ))即可。像往常一样,这一切都取决于上下文:)

试试这个:

clc

N = 1e4;

% Zigzag's solution
tic
for ii = 1:1e2
    v = randi(N, N,1);
    length(unique(v))==length(v);
end
toc


% Dennis Jaheruddin's solution 
tic
for ii = 1:1e4
    v = randi(N, N,1);
    all(diff(sort(v)));
end
toc

% My solution 
tic
for ii = 1:1e4
    v = randi(N, N,1);
    cond = true;
    for jj = 1:numel(v)
        if any(v(jj) == v(jj+1:end))
            cond = false; 
            break; 
        end
    end
end
toc

在循环内部生成随机数,以确保可以获得各种不同的情况。我的电脑上的结果:

Elapsed time is 16.787976 seconds.  % unique
Elapsed time is 14.284696 seconds.  % sort + diff
Elapsed time is  5.376655 seconds.  % loop + any

所以显式循环(提供feature accel已开启),提前退出实际上几乎是标准“矢量化”方法的三倍:)

PS - 我还试图嵌套另一个循环来尝试改进必须比较所有值,然后才能检测到相等的值(首先评估v(jj)==v(jj+1:end),在any()开始做它的工作之前),但是在这里,开销确实开始妨碍(或者JIT对这种事情的处理不够好,我不知道)。从理论上讲,这当然应该更快,但不幸的是,不是在MATLAB中:)

但是,更改随机数生成

v = randi(N, N,1);

进入

v = randi(N*N, N,1);

结果完全不同:

Elapsed time is 0.162625 seconds.   % unique
Elapsed time is 0.147369 seconds.   % sort + diff
Elapsed time is 30.767247 seconds.  % loop + any

这里我只使用了100次迭代而不是10.000,原因很明显:)