我有一个类似......的数组
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 ...请给我:)
答案 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