计算数组中唯一数字的出现 - MATLAB

时间:2014-10-04 07:47:05

标签: arrays matlab

我有一个类似......的数组

1 0 0 1 2 2 1 1 2 1 0

2 1 0 0 0 1 1 0 0 2 1

1 2 2 1 1 1 2 0 0 1 0

0 0 0 1 2 1 1 2 0 1 2

然而我的真实数组是(50x50)。

我对MATLAB相对较新,需要能够计算每行和每列中唯一值的数量,例如第2行和第3行中有4个' 1 ;列3中的0。我需要能够用我的真实阵列做到这一点。

如果这些数量的独特值也属于他们自己的数组,那将会更有帮助。

请使用简单的语言,否则我会迷路,例如,如果代表一个数组,不要把它称为x,但也许是column_occurances_array ...请给我:)

2 个答案:

答案 0 :(得分:2)

我要做的是遍历矩阵的每一行并计算每行的出现直方图。使用histc计算每行的出现次数。关于histc的好处是你能够指定垃圾箱开始积累的位置。这些对应于矩阵每行的唯一条目。因此,使用unique来计算这些唯一条目。

现在,我将使用arrayfun迭代矩阵中的所有行,这将产生一个单元格数组。此单元格数组中的每个元素将为您提供每行的每个唯一值的计数。因此,假设您的值矩阵存储在A中,您只需执行以下操作:

vals = arrayfun(@(x) [unique(A(x,:)); histc(A(x,:), unique(A(x,:)))], 1:size(A,1), 'uni', 0);

现在,如果我们要显示所有计数,请使用celldisp。使用您的示例,并将上述代码与celldisp结合使用,这就是我得到的结果:

vals{1} =

     0     1     2
     3     5     3



vals{2} =

     0     1     2
     5     4     2



vals{3} =

     0     1     2
     3     5     3



vals{4} =

     0     1     2
     4     4     3

上面显示的内容是,对于第一行,你有3个零,5个和3个两个。第二行有5个零,4个和2个两个,依此类推。这些仅适用于行。如果要对列执行这些操作,则必须稍微修改代码以按列操作:

vals = arrayfun(@(x) [unique(A(:,x)) histc(A(:,x), unique(A(:,x)))].', 1:size(A,2), 'uni', 0);

使用celldisp,这就是我们得到的:

vals{1} =

     0     1     2
     1     2     1



vals{2} =

     0     1     2
     2     1     1



vals{3} =

     0     2
     3     1



vals{4} =

     0     1
     1     3



vals{5} =

     0     1     2
     1     1     2



vals{6} =

     1     2
     3     1



vals{7} =

     1     2
     3     1



vals{8} =

     0     1     2
     2     1     1



vals{9} =

     0     2
     3     1



vals{10} =

     1     2
     3     1



vals{11} =

     0     1     2
     2     1     1

这意味着在第一列中,我们看到1个零,2个1和2个等等。

答案 1 :(得分:1)

我绝对同意rayryeng!但是,这里有一些代码,作为初学者可能更容易理解。它没有单元格数组或数组,并且非常不言自明:

%% initialize your array randomly for demonstration:
numRows = 50;
numCols = 50;
yourArray = round(10*rand(numRows,numCols));

%% do some stuff of what you are asking for
% find all occuring numbers in yourArray
occVals = unique(yourArray(:));

% now you could sort them just for convinience
occVals = sort(occVals);

% now we could create a matrix occMat_row of dimension |occVals| x numRows
% where occMat_row(i,j) represents how often the ith value occurs in the
% jth row, analoguesly occMat_col:
occMat_row = zeros(length(occVals),numRows);
occMat_col = zeros(length(occVals),numCols);
for k = 1:length(occVals)
    occMat_row(k,:) = sum(yourArray == occVals(k),2)';
    occMat_col(k,:) = sum(yourArray == occVals(k),1);
end