我想在matlab中计算两行的平均值

时间:2012-09-25 17:31:42

标签: matlab mean

我在matlab中有一个1028乘18的矩阵。我想用Matlab计算第1行和第2行的平均值,第3和第4行依此类推,得到一个带有平均值的新矩阵。

3 个答案:

答案 0 :(得分:4)

我认为您想要计算每对行的列方式。将数组重塑为2 x 18 * 1028/2,计算平均值(按列操作),并将结果重新整形为1028/2 x 18:

>> x = rand(1028, 18);
>> result = reshape(x, 2, 1028/2*18);
>> result = mean(result);
>> result = reshape(result, 1028/2, 18);

快速测试,以演示矢量化解决方案与成对行上的for循环相比的速度:

>> x = rand(1028, 18);
>> tic; result1 = zeros(1028/2, 18); for ii = 1:1028/2; result1(ii,:) = mean(x((2*ii-1):(2*ii),:)); end; toc;
Elapsed time is 0.022432 seconds.
>> tic; result2 = reshape(x, 2, 1028/2*18); result2 = mean(result2); result2 = reshape(result2, 1028/2, 18); toc;
Elapsed time is 0.000388 seconds.

答案 1 :(得分:2)

我认为你在寻找的是:

x = rand( 1028, 18 );
meanx = ( x(1:2:end,:) + x(2:2:end,:)) / 2;

运行后,meanx将是[514 x 18]矩阵。

meanx的第一行是x中第1行和第2行的平均值。

meanx的第二行是x中第3行和第4行的平均值。

meanx的第三行是x中第5行和第6行的平均值。

编辑

如果您还想根据第一行的值从平均过程中排除某些行,则可以添加以下内容:

dx = diff(x(:,1));

goodrows = (dx(1:2:end) == 0);  %find row-pairs for which the first elements match
badrows = ~goodrows;

goodmeans = meanx(goodrows,:)  %average rows with matching first element
badmeans = meanx(badrows,:)    %average rows with non-matching first element

答案 2 :(得分:0)

以b3和cjh的优秀答案为基础。这是最快的

m=1028;
n=18;
D=rand(m, n);

% compute mean for two neighboring rows
D=reshape(D, 2, m/2*n);
D=(D(1,:)+D(2,:))/2;
D=reshape(D, m/2, n);

在for循环中测量2000次迭代

b3         Elapsed time is 0.264215 seconds.
cjh        Elapsed time is 0.134812 seconds.
my version Elapsed time is 0.087994 seconds.

很清楚为什么。 b3使用函数均值,如果我们只想计算两个数的平均值,那么它对性能不太好。另一方面,聪明的重塑确保我们不必在读取数据期间跳过整个内存,就像cjh版本中的情况一样。因此,结合两种解决方案中的最佳解决方案可以获得最佳结果。