我需要一些帮助。我有一个数组,如下所示,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
答案 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)
我不明白你是如何使用示例代码解决问题的,但这里应该有用。这使用find
,any
和accumarray
,并且在循环的每次迭代中,它将返回与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