【发布时间】:2012-09-17 06:39:43
【问题描述】:
我在 matlab 中有一个 1028 x 18 矩阵。我想在 Matlab 中按列值、第三和第四等计算第一行和第二行的平均值,并得到一个具有平均值的新矩阵。
【问题讨论】:
我在 matlab 中有一个 1028 x 18 矩阵。我想在 Matlab 中按列值、第三和第四等计算第一行和第二行的平均值,并得到一个具有平均值的新矩阵。
【问题讨论】:
我认为您想计算每对行的按列均值。将数组重新整形为 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 秒。【讨论】:
for 循环,这应该会更快。
我认为您正在寻找的是:
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
【讨论】:
以 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 版本中的情况一样。因此,将这两种解决方案中最好的结合起来会得到最好的结果..
【讨论】: