我有以下向量v = [r1 r2 r3 r4 r5 .... rn]
,r
整数。
我想查一下:
如果r1
不等于r2
不等于r3
...不等于rn
(彼此不同):
print v
else(某些元素相等,其他元素不相等):
打印相等元素的索引。
答案 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,原因很明显:)