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);
>> 結果 = reshape(x, 2, 1028/2*18);
>>結果=平均(結果);
>>結果=変形(結果、1028/2、18);

行のペアに対する for ループと比較して、ベクトル化されたソリューションの速度を実証する簡単なテスト:

>> x = ランド (1028, 18);
>>チック; result1 = ゼロ (1028/2, 18); ii = 1:1028/2 の場合。result1(ii,:) = mean(x((2*ii-1):(2*ii),:)); 終わり; 目次;
経過時間は 0.022432 秒です。
>>チック; result2 = reshape(x, 2, 1028/2*18); 結果 2 = 平均 (結果 2); result2 = reshape(result2, 1028/2, 18); 目次;
経過時間は 0.000388 秒です。
于 2012-09-25T17:35:17.700 に答える
2

あなたが探しているのは次のとおりだと思います:

x = rand( 1028, 18 );
meanx = ( x(1:2:end,:) + x(2:2:end,:)) / 2;

これを実行meanxすると、[514 x 18] のマトリックスになります。

の最初の行meanxは、 の行 1 と 2 の平均ですx

の 2 行目meanxは、 の 3 行目と 4 行目の平均ですx

の 3 行目meanxは、 の行 5 と 6 の平均ですx

編集

最初の行の値に基づいて平均化手順から一部の行を除外する場合は、次を追加できます。

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 に答える