2014-02-17 83 views
0

我在Matlab中有(n×n)矩陣。例如(N = 3):matlab - 矩陣中出現的次數

A=[1,2,3; 4,5,6; 1,9,9] 

我要計數爲第一n號碼的出現次數(和創建矩陣B)。 輸出:

B=[2,1,1] 

謝謝。

+0

如果'A = [1,2; 3,1]'那麼你是'B = [2,1]'還是'B = [1,1]'?即你是在該列還是在整個表中計算? – Dan

回答

0

如果你有統計工具箱,你可以使用tabulatedoc),否則countmembermatlab exchange)將做到這一點。

TABLE = tabulate(A(:)); 
+0

假設人們需要像tabular(A(ismember(A,A(:,1))))'將其限制爲第一行值。 –

0

這應該做的伎倆:

A=[1,2,3; 4,5,6; 1,9,9]; 

    for i=1:length(A) 

     B(i) = length(find(A(1,i) ==A)); 
    end 
+0

雖然提到矩陣是'nxn',但是使用'length'通常會提出問題。在這種情況下,我會選擇'size(A,2)'來代替'length(A)'。 –

+0

這是正確的。長度(A(:,1))也可以工作,只指定維度2的長度。 – ewz

+0

如果性能是個問題,那麼'length(find)可能可以用sum來代替 –

0

這可以用ismember做到:

[lia,lib]=ismember(A,A(1,:)) 
h=hist(lib(lib>0),1:size(A,2)) 
+0

這會返回'B = [ 2 1 6]'。 –

+0

@MohsenNosratinia我現在看到,使用直方圖可能不太實際。已將方法改爲「ismember」。 –

1

這可以用bsxfunsum非常優雅的完成。

sum (bsxfun (@eq, A(1:n), A(:))) 

但是,我相信你的例子是不正確的。在您的示例矩陣

A=[1,2,3; 4,5,6; 1,9,9] 

的前3個元素是不是[1 2 3][1 4 1]因爲在Matlab元素在列主順序。如果要檢查第一行中的第一個n元素,則應該改爲:

sum (bsxfun (@eq, A(1,1:n), A(:)))