I want to calculate the mean of two rows in matlab

大城市里の小女人 提交于 2019-12-02 10:35:26

I think you want to calculate the column-wise mean of every pair of rows. Reshape the array to be 2 x 18*1028/2, calculate the mean (which operates column-wise), and reshape the result to be 1028/2 x 18:

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

A quick test to demonstrate the speed of vectorized solution compared to a for-loop over pairs of rows:

>> 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.

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

Building on excellent answers by b3 and cjh. This one is the fastest

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);

Measured in a for loop for 2000 iterations

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

It is clear why. b3 uses function mean, which is not so good for performance if we just want to compute average of two numbers. On the other hand, clever reshapes make sure that we do not have to jump all over the memory during reading of the data, as is the case in the version of cjh. Hence, combining the best of the two solutions gives best results..

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!