13

accumarray()val引数はベクトルでなければなりません。私の場合、行列の列を合計(または平均)する必要があります。これを実現する機能や方法はありますか?

私が今していることは、forループで、列の値を個別に合計しています。

for iCol = 1:nCols
    means(:,iCol) = accumarray(labels', X(:,iCol));
end
4

2 に答える 2

9

1 つの解決策は、行インデックスを複製し、列インデックスのlabels別の列を追加することです。次にX、列ベクトルに形状を変更して、 accumarray1 回適用できます。

labels = [repmat(labels(:),nCols,1) ...            % Replicate the row indices
          kron(1:nCols,ones(1,numel(labels))).'];  % Create column indices
totals = accumarray(labels,X(:));  % I used "totals" instead of "means"


使い方...

A = accumarray(subs,val)列ベクトルsubsとベクトルの場合、出力列ベクトルの行の合計にval数値を追加することで機能します。ただし、行インデックス以上のものを含めることができます。出力で値を割り当てるために、複数の次元の添え字インデックスを含めることができます。この機能により、ベクトルではなく行列である入力を処理できるようになります。val(i)subs(i)Asubsval

まず、 の入力は、コロン演算子valを使用して列ベクトルに再形成できます。次に、出力のどの列に値を配置する必要があるかを追跡するために、追加の列インデックスを含めるように入力を変更できます。これがどのように機能するかを説明するために、次のサンプル入力を使用します。 X(:)X(:)subs

labels = [3; 1; 1];
X = [1 2 3; ...
     4 5 6; ...
     7 8 9];
nCols = 3

上記のコードの変数は次のようになります。

labels = 3 1    X(:) = 1    totals = 11 13 15
         1 1           4              0  0  0
         1 1           7              1  2  3
         3 2           2
         1 2           5
         1 2           8
         3 3           3
         1 3           6
         1 3           9

たとえば、1 4 7元は の最初の列にあった値Xは、 の 2 番目の列の最初の 3 行の値で示されるように、出力の最初の列にのみ累積されることに注意してlabelsください。結果の出力は、累積を実行するために各列をループする問題のコードを使用して得られるものと同じである必要があります。

于 2010-12-04T00:19:19.137 に答える