我有以下矢量v = [r1 r2 r3 r4 r5 .... rn]
,與r
整數。檢查矩陣元素是否都是不相等或不同元素
我要檢查:
如果r1
不等於r2
不等於r3
...不等於rn
(所有互不相同的):
打印v
其他(某些元素相等並且其他不相等):
打印相等元素的索引。
我有以下矢量v = [r1 r2 r3 r4 r5 .... rn]
,與r
整數。檢查矩陣元素是否都是不相等或不同元素
我要檢查:
如果r1
不等於r2
不等於r3
...不等於rn
(所有互不相同的):
打印v
其他(某些元素相等並且其他不相等):
打印相等元素的索引。
我建議使用unique
命令。它將返回所有唯一值的值。
如果你要檢查你的矩陣v
所有值都是唯一的,我會用下面的命令:
everything_is_unique = length(unique(v))==length(v);
您也可以返回相同元素的索引。 有關更多信息,請參閱the documentation on unique
。
交替使用獨特的,你也可以將元素進行排序,並檢查它們是否是完全不同的:
all(diff(sort(v)))
通過使用更多的輸入arguements排序,你可以得到你所尋找的指標。
請注意,對於短向量,這應該優於循環。對於很長的一個循環可能會更快。 –
我會再給出一個解決方案,並比較迄今爲止嘗試過的所有方法。
我的解決方案基於以下觀察結果:使用內置函數(如sort()
或unique()
)時,您失去了提前逃脫的機會。也就是說,sort()
必須在完成之前對矢量進行排序,然後才能繼續使用算法,即使在sort
內已經檢測到兩個相等的值時不需要這樣做。
因此,我只需遍歷數組,然後使用any()
將當前值與以下所有值進行比較。這可以解決其中的一些問題,並且對於很多情況來說運作良好。
然而,最壞的情況下複雜度爲O(N²),這是差了很多比sort()
地獄,它只有O(N·日誌(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,原因很明顯s :)
你的意思是'everything_is_unique = length(unique(v))== length(v); ?因爲你比較了矢量和標量。 – Adiel