2017-05-16 27 views
2

私は2x3行列m = [1.1, 2.0, 0.5 ; 0.9, 1.5, 1.1];を持っています。 2番目の次元に沿った累積幾何平均を計算する必要があります。つまり、結果の行列resultsも同じ次元(2x3)を持つ必要があります。基本的には、cumprodと、1/nの電力を取るために必要な拡張機能を使用することに匹敵します。nは列番号です。MATLAB:累積幾何平均

resultsは、次のようになります。

[(1.1)^(1/1), (1.1 * 2.0)^(1/2), (1.1 * 2.0 * 0.5)^(1/3) ; 
(0.9)^(1/1), (0.9 * 1.5)^(1/2), (0.9 * 1.5 * 1.1)^(1/3)] 

results = cumprod(m,2)は、乗算のコンポーネントを提供します。しかし、適切な力を得るためには、最も賢い方法は何ですか?

答えて

7

パワーbsxfunの使用 -

bsxfun(@power, cumprod(m,2), 1./(1:size(m,2))) 

サンプル実行 - 新しいMATLABのバージョンで

>> m 
m = 
    1.1000 2.0000 0.5000 
    0.9000 1.5000 1.1000 
>> bsxfun(@power, cumprod(m,2), 1./(1:size(m,2))) 
ans = 
    1.1000 1.4832 1.0323 
    0.9000 1.1619 1.1409 
>> [(1.1)^(1/1), (1.1 * 2.0)^(1/2), (1.1 * 2.0 * 0.5)^(1/3) ; 
    (0.9)^(1/1), (0.9 * 1.5)^(1/2), (0.9 * 1.5 * 1.1)^(1/3)] 
ans = 
    1.1000 1.4832 1.0323 
    0.9000 1.1619 1.1409 

implicit-expansionと、式はに単純化する -

cumprod(m,2).^ (1./(1:size(m,2))) 
+0

です完全に正常に動作します!ありがとう。 – Andi

+0

フォローアップ質問: 最初の次元に沿って累積幾何平均をとる必要がある場合、つまり bsxfun(@power、cumprod(m、1)、1./(1:size(m,1))) ? ただし、結果として寸法エラーが発生します。 "bsxfunを使用した場合のエラー 2つの入力配列の非シングルトン寸法は で一致する必要があります。 – Andi

+0

@Andi試してみてください: 'bsxfun(@power、cumprod(m、1)、[1./(1:size(m,1))] ')'。 – Divakar

関連する問題