我在matlab中有一个1028乘18的矩阵。我想用Matlab计算第1行和第2行的平均值,第3和第4行依此类推,得到一个带有平均值的新矩阵。
答案 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版本中的情况一样。因此,结合两种解决方案中的最佳解决方案可以获得最佳结果。