MATLAB - 带条件的数组元素的频率

时间:2016-09-26 01:52:01

标签: matlab

我需要一些帮助。我有一个数组,如下所示,6行和5列,任何一行中没有任何元素重复。元素都是单位数字。 我想知道,每一行,当一个数字,让我们说1出现时,我想要保留该行的其他数字出现的频率。例如,1在第1,3和5行中显示3次。当1出现时,2显示一次,3显示两次,4显示两次,5显示一次,6显示两次,7显示一次,8显示三次,9显示零次。我希望通过以V = [3,1,2,2,1,2,1,3,0]

之类的向量开头,保留这些信息的矢量N = [1,2,3,4,5,6,7,8,9]
ARRAY =
    1     5     8    2    6
    2     3     4    6    7 
    3     1     8    7    4
    6     5     7    9    4
    1     4     3    8    6
    5     7     8    9    6

我在下面的代码没有给出我想要的反馈,有人可以帮忙吗?感谢

for i=1:length(ARRAY)
    for j=1:length(N)
        ARRAY(i,:)==j
        V(j) = sum(j)         
    end 
end 

2 个答案:

答案 0 :(得分:1)

使用A creae中的索引零和一个6 * 9矩阵,如果第i行包含j,则[i,j]元素为1。

然后将零和一个矩阵与其转置相乘以得到理想的结果:

A =[...
    1     5     8    2    6
    2     3     4    6    7 
    3     1     8    7    4
    6     5     7    9    4
    1     4     3    8    6
    5     7     8    9    6]
% create a matrix with the size of A  that each row contains the row number
rowidx = repmat((1 : size(A,1)).' , 1 , size(A , 2))
% z_o a zero and one  6 * 9 matrix that  [i,j] th element of it is 1 if i th row of A contains j
z_o = full(sparse(rowidx , A, 1))
% matrix multiplication with its transpose to create desirable result. each column relates to number N
out = z_o.' * z_o

结果:每列与N

相关
   3   1   2   2   1   2   1   3   0
   1   2   1   1   1   2   1   1   0
   2   1   3   3   0   2   2   2   0
   2   1   3   4   1   3   3   2   1
   1   1   0   1   3   3   2   2   2
   2   2   2   3   3   5   3   3   2
   1   1   2   3   2   3   4   2   2
   3   1   2   2   2   3   2   4   1
   0   0   0   1   2   2   2   1   2

答案 1 :(得分:0)

我不明白你是如何使用示例代码解决问题的,但这里应该有用。这使用findanyaccumarray,并且在循环的每次迭代中,它将返回与V中的第i个元素对应的N

for i=1:length(N)
    rowIdx = find(any(A == N(i),2)); % Find all the rows contain N(j)
    A_red = A(rowIdx,:); % Get only those rows
    V = [accumarray(A_red(:),1)]'; % Count occurrences of the 9 numbers
    V(end+1:9) = 0; % If some numbers don't exist place zeros on their counts
end