我在 matlab 中有一个 1028 x 18 矩阵。我想在 Matlab 中按列值、第 3 行和第 4 行等计算第 1 行和第 2 行的平均值,并得到一个具有平均值的新矩阵。
3 回答
我想你想计算每对行的列平均值。将数组重新整形为 2 x 18*1028/2,计算平均值(按列操作),并将结果重新整形为 1028/2 x 18:
>> x = 兰德(1028, 18); >> 结果 = 重塑(x, 2, 1028/2*18); >> 结果 = 平均值(结果); >> 结果 = 重塑(结果, 1028/2, 18);
与行对上的 for 循环相比,演示矢量化解决方案的速度的快速测试:
>> x = 兰德(1028, 18); >> 抽动; 结果1 = 零(1028/2, 18);对于 ii = 1:1028/2;结果1(ii,:) = 平均值(x((2*ii-1):(2*ii),:)); 结尾; 目录; 经过的时间是 0.022432 秒。 >> 抽动; 结果2 = 重塑(x, 2, 1028/2*18); 结果2 =平均值(结果2);结果 2 = 重塑(结果 2、1028/2、18);目录; 经过的时间是 0.000388 秒。
I think what you are looking for is:
x = rand( 1028, 18 );
meanx = ( x(1:2:end,:) + x(2:2:end,:)) / 2;
After running this, meanx
will be a [514 x 18] matrix.
The first row of meanx
is the average of rows 1 and 2 in x
.
The second row of meanx
is the average of rows 3 and 4 in x
.
The third row of meanx
is the average of rows 5 and 6 in x
.
EDIT:
If you also want to exclude some of the rows from the averaging procedure based on the value of the first row, then you can add the following:
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
以 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 使用函数均值,如果我们只想计算两个数字的平均值,这对性能不太好。另一方面,巧妙的 reshape 确保我们在读取数据期间不必像 cjh 的版本那样跳过整个内存。因此,结合两种解决方案中最好的一个可以得到最好的结果。