2016-09-26 15 views
0

何か助けてください。私は配列を持っています。以下に示すように、6行5列です。いずれの行の要素も繰り返しません。要素はすべて1桁の数字です。 数字を入力すると1行が表示されますが、行の他の数字が表示される頻度を維持したいと考えています。たとえば、1は1行目、3行目、5行目に3回表示されます。 1が表示されているときは2が1回、3が2回、4が2回、5が1回、6が2回、7が1回、8が3回、ゼロ回。私は、誰かが助けてくださいすることができ、私は以下の持っているコードは、私が探していますフィードバックを与えるものではありません?MATLAB - 条件付き配列要素の頻度

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 

N = [1,2,3,4,5,6,7,8,9]

のようなベクターを用いて開始することにより、 V = [3,1,2,2,1,2,1,3,0]、次のようになります。この情報のベクトルを維持したいですかありがとう

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

答えて

0

サンプルコードでどのように問題に近づいているのかわかりませんが、ここでうまくいくはずです。これはfindanyaccumarray使用し、ループの各反復では、A CREAE 0と1の6×9のマトリックス[ているインデックスを使用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 
1

内のi番目の要素に対応するVが返されますi、j]番目の要素がAの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 

結果

そして望ましい結果を得るためにその転置で0と1の行列を乗算各列が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 
+0

ニーストリックに関し、これは 'forループを回避します'! –