0

我在 matlab 中有一个 1028 x 18 矩阵。我想在 Matlab 中按列值、第 3 行和第 4 行等计算第 1 行和第 2 行的平均值,并得到一个具有平均值的新矩阵。

4

3 回答 3

4

我想你想计算每对行的列平均值。将数组重新整形为 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 秒。
于 2012-09-25T17:35:17.700 回答
2

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
于 2012-09-25T18:50:32.493 回答
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 使用函数均值,如果我们只想计算两个数字的平均值,这对性能不太好。另一方面,巧妙的 reshape 确保我们在读取数据期间不必像 cjh 的版本那样跳过整个内存。因此,结合两种解决方案中最好的一个可以得到最好的结果。

于 2012-09-25T19:02:04.150 回答