1

次のアクションを実行するプログラムが必要です。

  • 同じサイズ (1126x1440 double) の複数の行列を読み取る

  • 各セルで最も多く発生する値を選択します (行列の同じ i,j)

  • この値を、対応する i,j 位置に同じサイズ 1126x1440 の出力行列に書き込みます。これにより、この出力行列の各セルには、すべての入力行列の同じ位置から最も出現する値が含まれます。

4

2 に答える 2

3

@angainorの答えに基づいて、mode関数を使用するより簡単な方法があると思います。

nmatrices - number of matrices
n, m      - dimensions of a single matrix
maxval    - maximum value of an entry (99) 

まず、データを次元[n X mXnmatrices]の3Dマトリックスに編成します。例として、次のランダムデータを3D形式で生成できます。

CC = round(rand(n, m, nmatrices)*maxval); 

そして、最も頻繁な値の計算は1行です。

B = mode(CC,3);   %compute the mode along the 3rd dimension
于 2012-09-22T13:48:39.653 に答える
0

必要なコードは次のとおりです。いくつかの定数を導入しました。

nmatrices - number of matrices
n, m      - dimensions of a single matrix
maxval    - maximum value of an entry (99)

まず、rand を使用して行列の例を生成します。行列はベクトルに変更され、CC 行列に連結されます。したがって、CC の次元は [m*n, nmatrices] です。CC のすべての行は、すべての行列 (分析する行列) の個々の (i,j) 値を保持します。

CC = [];
% concatenate all matrices into CC
for i=1:nmatrices
    % generate some example matrices
    % A = round(rand(m, n)*maxval);
    A = eval(['neurone' num2str(i)]);
    % flatten matrix to a vector, concatenate vectors
    CC = [CC A(:)];
end

今、私たちは本当の仕事をします。matlab は列ベースの行列で動作するため、CC を転置する必要があるため、行ではなく CC の個々の列を分析したいと考えています。次に、histc を使用して、CC のすべての列、つまりすべての行列の (i,j) エントリで最も頻繁に発生する値を見つけます。histc は、CC のすべての列で、指定されたビン (この場合は 1:maxval) に入る値をカウントします。

% CC is of dimension [nmatrices, m*n]
% transpose it for better histc and sort performance
CC = CC';
% count values from 1 to maxval in every column of CC
counts = histc(CC, 1:maxval);

カウントには次元 [maxval, m*n] があります - 元の行列の (i,j) ごとに、1:maxval からの特定の値が表される回数がわかります。ここで最後に行うことは、カウントを並べ替えて、最も頻繁に発生するものを見つけることです。並べ替えられたカウントは必要ありません。カウントのどのエントリが最も高い値を持つかを教えてくれる順列が必要です。それはまさにあなたが知りたいことです。

% sort the counts. Last row of the permutation will tell us, 
% which entry is most frequently found in columns of CC
[~,perm] = sort(counts);

% the result is a reshaped last row of the permutation
B = reshape(perm(end,:)', m, n);

Bはあなたが望むものです。

于 2012-09-22T12:51:26.183 に答える