对于每个整数,取所有值的平均值

时间:2013-10-17 19:25:30

标签: matlab

我对我要解决的问题有疑问。

我有一个相当大的数组,其中一系列数字范围从第4列中的4,4.2,4.4和16,16.5,16.7等等,第2列中的一系列0和1对应于每个数字,例如列1表示5,第2列表示0.下面是我正在使用的矩阵的一个非常小的版本:

[5,0;5.10000000000000,0;5.20000000000000,0;5.25000000000000,0;5.30000000000000,0;5.35000000000000,0;5.45000000000000,0;5.50000000000000,0;5.55000000000000,0;5.60000000000000,0;14.2000000000000,0;5.70000000000000,0;5.80000000000000,0;5.90000000000000,0;14.0000000000000,0;14.9500000000000,1;14.8500000000000,1;14.6000000000000,1;14.3500000000000,1;14.3000000000000,1;14.2500000000000,1;14.3500000000000,1;14.2500000000000,1;14.1500000000000,1;14.0500000000000,1;]

我想要做的是为第1列中的每个整数编写平均第2列的0和1的代码。老实说我不知道​​从哪里开始,我开始写一个for循环,但不确定我是怎么做的将根据第1列中的一组行对第2列中的一组行执行一个进程。有没有人有任何想法?我很抱歉我还没有任何示例代码,老实说我不知道​​该做什么。

2 个答案:

答案 0 :(得分:2)

我会做这样的事情:

integers = floor(inputMatrix(:,1));
uniqueIntegers = unique(integers);
K = numel(uniqueIntegers);

outputMean = nan(1,K);
for k = 1:K
    outputMean(k) = mean(inputMatrix(integers==uniqueIntegers(k),2)));
end

其中inputMatrix是上面的矩阵。用简单的英语,将第一列转换为带有floor函数的整数,选出唯一值,然后遍历唯一值并使用逻辑索引查找均值。两个向量uniqueIntegersoutputMean分别包含那些整数和第二列的平均值。

正如评论中所建议的,我认为有几种方法可以阅读这个问题。首先,如上所述,OP希望将小数点左边5的所有内容放在一起。

但是,如果OP想要只包含那些包含5(或其他整数)的值,那么将循环中的值替换为:

outputMean(k) = mean(inputMatrix(inputMatrix(:,1)==uniqueIntegers(k),2)));

但是,如果OP想要将包含整数的所有值平均在一起,无论值是什么,那么整个代码块可以简化为:

integers = floor(inputMatrix(:,1)) == inputMatrix(:,1);
outputMean = mean(inputMatrix(integers,2));

答案 1 :(得分:2)

如果我理解正确,你想要第一列的所有值的平均值在第一列中具有相同的整数部分。

您可以通过略微修改a previous question的答案来实现此目的。让x成为您的数据(2列,任意行数)。然后:

x1_int = floor(x(:,1));
[value_sort ind_sort] = sort(x1_int);
[~, ii, jj] = unique(value_sort);
n = diff([0; ii]);
result = [ x1_int(ii) accumarray(jj,x(ind_sort,2))./n ];

如果您使用Matlab 2013a或更新版本,请使用以下内容替换第三行。这是必要的,因为在Matlab 2013a中已更改unique函数:

[~, ii, jj] = unique(value_sort,'legacy');

变量result在其第1列中包含x第1列的整数部分,在其第2列中包含x第2列的相应平均值。使用您的示例数据:

x= [5.0000         0
    5.1000         0
    5.2000         0
    5.2500         0
    5.3000         0
    5.3500         0
    5.4500         0
    5.5000         0
    5.5500         0
    5.6000         0
   14.2000         0
    5.7000         0
    5.8000         0
    5.9000         0
   14.0000         0
   14.9500    1.0000
   14.8500    1.0000
   14.6000    1.0000
   14.3500    1.0000
   14.3000    1.0000
   14.2500    1.0000
   14.3500    1.0000
   14.2500    1.0000
   14.1500    1.0000
   14.0500    1.0000]

结果是

result =

    5.0000         0
   14.0000    0.8333