在MATLAB中仅取部分矩阵的平均值

时间:2014-05-29 09:02:39

标签: arrays matlab loops matrix

这是一个非常简单的问题,请耐心等待。

[可能重复?] 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

我在这里走在正确的轨道上吗?

3 个答案:

答案 0 :(得分:3)

好吧,我先从this post

开始使用1-liner
M = [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