2017-09-04 21 views
0

私はMatlabのPという名前の4x4行列を持っています。新しい4x4行列を作成するために、Pをべき乗(例えばX)にします。そして、0から51までの行列(つまり、P^0 + P^1 + ... + P^52)を合計したいと思います。Matlabの行列の和表記

もちろん、これはあまりにも長い時間をかけて書けるでしょう。これを短縮する方法はありますか?

syms k 

symsum(P^k, k, [0 51]) 

私が欲しいものを返さない:

は、私はすでに、次のコードを試してみました。あなたはシンボリックな数学を使用していたので

おかげ

+0

'0' 51'含まない 'の' 52' –

+0

は注意してくださいマトリックスpower' [(^)](https://www.mathworks.com/help/matlab/ref/ 'そのmpower.html)は、要素単位の電力[(。^)](https://www.mathworks.com/help/matlab/ref/power.html)とは異なります。 – rahnema1

答えて

0

は、私はあなたがループして問題のないことだろう願っています。

req_sum = zeros(size(P)); 
for k=0:51     %loop for all the powers 
    req_sum = req_sum + P^k; %adding the results of each iteration 
end 
1

ベクトル溶液がそうようbsxfunで行うことができる:MATLABバージョンR2016bについて

result = sum(bsxfun(@power, P, reshape(0:51, [1 1 52])), 3); 

以降、これは(他の言語の「放送」としても知られる)implicit expansionで行うことができる。

result = sum(P.^reshape(0:51, [1 1 52]), 3); 

実際にsymbolicallyを実行しようとしていて、結果が得られない場合は、誤った操作を使用している可能性がありますエリータ。 matrix power operator^であり、element-wise power operator.^です。もし(Pが4×4の数値行列である)、これを望むことができる。

syms k 
symsum(P.^k, k, [0 51]) 
0

ます(オクターブで)subsを使用して以下のようにそれを行うことができます:例えば

syms 'P' 'k'; 
subs(symsum(P^k, k, [0 51]), [1 1;1 1]) 

P = [1 1; 1 1]

0

@gnoviceの良いアイデアの後に場所があれば、私の直感はそれをベクトル化するだけでした。 gnoviceとはちょっと別の方法ですが、私の意見ではbsxfunより読みやすいです。

result=reshape(sum(P(:).^[0:51],2),size(P))