accumarray()の val
引数はベクトルでなければなりません。私の場合、行列の列を合計(または平均)する必要があります。これを実現する機能や方法はありますか?
私が今していることは、forループで、列の値を個別に合計しています。
for iCol = 1:nCols
means(:,iCol) = accumarray(labels', X(:,iCol));
end
accumarray()の val
引数はベクトルでなければなりません。私の場合、行列の列を合計(または平均)する必要があります。これを実現する機能や方法はありますか?
私が今していることは、forループで、列の値を個別に合計しています。
for iCol = 1:nCols
means(:,iCol) = accumarray(labels', X(:,iCol));
end
1 つの解決策は、行インデックスを複製し、列インデックスのlabels
別の列を追加することです。次にX
、列ベクトルに形状を変更して、 accumarray
1 回適用できます。
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)
A
subs
val
まず、 の入力は、コロン演算子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
ください。結果の出力は、累積を実行するために各列をループする問題のコードを使用して得られるものと同じである必要があります。