这是一个非常简单的问题,请耐心等待。
[可能重复?] Finding the average of parameters controlled by other indices
假设我有一个矩阵,数据组织如下
1 0.64
1 4.64
1 4.75
2 0.64
2 9.75
2 5.74
3 5.23
3 2.65
3 1.08
3 1.08
3 6.22
现在,我想取第一列中数据相同的那些字段的平均值,例如
1 3.34
2 5.37
3 3.25
请注意,特定值集的大小可能会有所不同,例如1
重复3次,但3
重复5次。
我有一个名为figNum
的变量中第一列的最大值,例如14
。唯一的问题是我不知道矩阵中每个数据集的大小。
到目前为止,我的努力是:
for p = 1:numel(matrix_name)
if(matrix_name(p:1) == figNum)
avg = avg + matrix_name(p:1);
end
figNum = figNum-1;
end
我在这里走在正确的轨道上吗?
答案 0 :(得分:3)
好吧,我先从this post
开始使用1-linerM = [1, 0.64;
1, 4.64;
1, 4.75;
2, 0.64;
2, 9.75;
2, 5.74;
3, 5.23;
3, 2.65;
3, 1.08;
3, 1.08;
3, 6.22]
% This gives a cell array with 3 cells
A = arrayfun(@(x) M(M(:,1) == x, :), unique(M(:,1)), 'uniformoutput', false)
% This gives a cell array with the means
c = cellfun(@mean, A, 'UniformOutput', false)
% Convert back to matrix
cell2mat(c)
答案 1 :(得分:3)
灵感来自sweet answer -
<强>代码强>
%// Assuming A is your input matrix
A =[1 0.64
1 4.64
1 4.75
2 0.64
2 9.75
2 5.74
3 5.23
3 2.65
3 1.08
3 1.08
3 6.22]
[~,~,ind] = unique(A(:,1))
average_values = accumarray(ind, A(:,2), [], @mean)
现在,如果第一列A
始终排序,您可以使用 -
average_values = nonzeros(accumarray(A(:,1), A(:,2), [], @mean))
除了被排序之外,如果第一列具有连续顺序的值(如给定数据的情况),则可以使用非常简单的代码 -
average_values = accumarray(A(:,1), A(:,2), [], @mean)
<强>输出强>
average_values =
3.3433
5.3767
3.2520
答案 2 :(得分:1)
如果你称之为矩阵A
,你可以使用这段代码做你想做的事:
% find diferent indexes
ind=unique(A(:,1));
avrg=zeros(numel(ind),1);
for ii=1:numel(ind)
% In case your index are not in ascending order +1
auxind=ind(ii);
% compute the mean of the 2column in the indexes that are equal to
% actual index
avrg(ii)=mean(A(find(A(:,1)==auxind),2));
end