是否有一个将矩阵作为"val"的accumarray()? [英] Is there an accumarray() that takes matrix as `val`?
问题描述
accumarray()的val
参数必须是向量.在我的情况下,我需要对矩阵的各列进行求和(或平均).有功能或方法可以实现这一目标吗?
accumarray()'s val
argument must be a vector. In my case I need columns of a matrix to be summed (or averaged). Is there a function or a method to achieve this?
我现在正在做的是在for循环中,我分别对列值求和:
What I am doing now is in a for loop I am summing column values separately:
for iCol = 1:nCols
means(:,iCol) = accumarray(labels', X(:,iCol));
end
推荐答案
一种解决方案是复制labels
中的行索引,并添加另一列的列索引.然后,您可以将X
整形为列向量,并应用 accumarray
一次:
One solution is to replicate the row indices in labels
and add another column of column indices. Then you can reshape X
into a column vector and apply accumarray
once:
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)
通过将val(i)
中的数字与输出列向量A
中行subs(i)
中的总数相加来工作.但是,subs
不仅可以包含行索引.它可以包含多个维度的下标索引,以在输出中分配值.使用此功能可以处理输入val
,它是矩阵而不是向量.
A = accumarray(subs,val)
for a column vector subs
and vector val
works by adding the number in val(i)
to the total in row subs(i)
in the output column vector A
. However, subs
can contain more than just row indices. It can contain subscript indices for multiple dimensions to assign values to in the output. This feature is what allows you to handle an input val
that is a matrix instead of a vector.
First, the input for val
can be reshaped into a column vector using the colon operator X(:)
. Next, in order to keep track of which column in the output the values in X(:)
should be placed, we can modify the input subs
to include an additional column index. To illustrate how this works, I'll use these sample inputs:
labels = [3; 1; 1];
X = [1 2 3; ...
4 5 6; ...
7 8 9];
nCols = 3
这是上面代码中的变量最终看起来像什么:
And here are what the variables in the above code end up looking like:
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
例如,请注意,最初在X
的第一列中的值1 4 7
将仅在输出的第一列中累积,如第二个的前三行中的值所示labels
的列.结果输出应该与在问题中遍历每一列以执行累加的代码相同.
Notice, for example, that the values 1 4 7
that were originally in the first column of X
will only be accumulated in the first column of the output, as denoted by the ones in the first three rows of the second column of labels
. The resulting output should be the same as what you would have gotten by using the code in the question where you loop over each column to perform the accumulation.
这篇关于是否有一个将矩阵作为"val"的accumarray()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!