2013-10-08 44 views
5

每個人在矩陣中找到唯一的(不重複的)值。比方說,我有以下(3×3)矩陣A:如何通過使用matlab

0 1 3 
0 0 3 
0 0 0 

我的問題是如何找到利用Matlab在矩陣中的獨特價值? 在這種情況下,結果應爲1。 我曾嘗試使用

value=unique(A) 

但它返回一個矢量{0; 1; 3}不是我想要的。

我非常感謝,如果你們能幫我解決這個問題。謝謝!

回答

4

這裏是一個短一個

value = A(sum(bsxfun(@eq, A(:), A(:).'))==1); 

它比較矩陣中的所有元素對並計算它們相等的次數並返回僅計數一次的元素。

+2

這是一個不錯的。我總是驚訝於我的舊代碼有多少是用'bsxfun'簡化的。 MathWorks應該早些介紹它。 @ * - 請注意,在這個解決方案中有一個尺寸爲'numel(A)* numel(A)'的臨時矩陣,如果矩陣大小推動100個元素爲正方形,則矩陣可能會受到阻礙。它有助於它是一個邏輯矩陣,但它仍然是很好的意識到這一點...最近我發佈了一個光滑的基於bsxfun的解決方案,結果當作者有一個大的數據集時不可行。當然,這個3x3的例子是沒有問題的! – chappjc

1

計數的方法,我通常喜歡使用sortdiff如下,

[x,sortinds] = sort(A(:)); 
dx = diff(x); 
thecount = diff(find([1; dx; 1])); 
uniqueinds = [find(dx); numel(x)]; 
countwhat = x(uniqueinds); 

那麼你只有一個出現搶值(S):

lonelyValues = countwhat(thecount==1) 

如果你想要的位置矩陣中的這些值:

valueInds = sortinds(uniqueinds(thecount==1)) 
[valRows,valCols] = ind2sub(size(A),valueInds) 

如果你e考慮到您的矩陣中的任何NaN和/或Inf值,您必須進行額外的簿記工作,但想法是相同的。

2

這裏是一個行選擇:

find(histc(A(:), 0:3)==1) - 1 

或者更一般地:

find(histc(A(:), min(A(:)):max(A(:)))==1) + min(A(:)) - 1 

OR一概而論它甚至進一步(處理浮子)

p = 0.1; %//Set a precision. 
(find(histc(A(:), min(A(:)):p:max(A(:)))==1) + min(A(:)) - 1)*p 
+2

這隻在矩陣的元素是整數時才起作用,可以用'-1.5'或'2.5'替換示例中的一個零值。 –

+1

當矩陣的大小很大時,第二個matlab線條效果最好。我的情況是1e6元素。謝謝! – marsei

1

下面是使用unique()hist()另一種選擇:

計數元素:

[elements,indices,~] = unique(A);    % get each value with index once 
counts = hist(A(:), elements);     % count occurrences of elements within a 

得到元素:

uniqueElements = elements(counts==1);   % find unique elements 

獲得指數:

uniqueIndices = indices(counts==1);   % find unique indices 
[uRow, uCol] = ind2sub(size(A),uniqueIndices); % get row/column representation