我对我要解决的问题有疑问。
我有一个相当大的数组,其中一系列数字范围从第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列中的一组行执行一个进程。有没有人有任何想法?我很抱歉我还没有任何示例代码,老实说我不知道该做什么。
答案 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
函数的整数,选出唯一值,然后遍历唯一值并使用逻辑索引查找均值。两个向量uniqueIntegers
和outputMean
分别包含那些整数和第二列的平均值。
正如评论中所建议的,我认为有几种方法可以阅读这个问题。首先,如上所述,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