1

MATLAB の構文は、インデックスを一度に 1 つずつ反復する従来の DO ループの「ロジック」とは多少異なります。それを念頭に置いて、次のように書くより適切な方法は何でしょうか。実行は少し速くなりますが、MATLAB にあまり慣れていない人にとっては比較的明確です。

KT = 0.;
for i=1:37
   dKT = KTc(i,1) *const2^KTc(i,2) *const3^KTc(i,3) *const4^KTc(i,4) *const5^KTc(i,5);
   KT = KT + dKT;
end
sprintf('KT = %f10.8', KT);

KTc は 37x5 の行列です (役立つ場合、(i,1) 値のみが REAL 値で、残りは INTEGER です)

すべての定数は REAL スカラーです。

4

3 に答える 3

2

あなたの行は(元の質問で)正しく:

KT = 0.;
for i=1:37
   dKT = KTc(i,1) *const2^KTc(i,2) *const3^KTc(i,3) *const4^KTc(i,4) *const5^KTc(i,5);
   KT = KT + dKT;
end
sprintf('KT = %f10.8', KT);

一方、私は提案します

KT = repmat([1; const2; const3; const4; const5], 1, n) .^ KTc;
KT(1,:) = KTc(1,:);
KT = sum(KT(:));

実際の matlab スタイルのプログラムでループが使用されることはめったにありません。その理由は、私の 2 番目のソリューションはより多くの操作を実行しますが、実際には、プロセッサでの最適なキャッシュ、並列化、およびバックグラウンドでサイレントに実行されるその他の可能な最適化により、より高速であるためです。

更新: (repmat の説明)

repmat は「複製マトリックス」の略だと思います。それが実際に行うことは、2 つの典型的な例で最もよく説明されています。

v_row=[1 2 3];
repmat(v_row, 2, 1);
%result:
[1 2 3
 1 2 3]

v_col=[1;2;3];      % I could also write v_col=v_row';
repmat(v_col, 1, 2);
[1 1
 2 2
 3 3]

一般に、repmat はこれを行います。

repmat(m, 2, 3);
[m m m
 m m m] 
% if m=[1 2; 3 4] was the value of m, then
 [1     2     1     2     1     2
  3     4     3     4     3     4
  1     2     1     2     1     2
  3     4     3     4     3     4]    
于 2012-12-03T18:37:13.023 に答える
0

最初に対数を取ってから指数を取って、これらすべての指数関数を避けます。

    % // way cheaper to evaluate
  log_KT = log([c1 c2 c3 c4])*KT_coeff(2:end,:); 
    % // Final exp
  KT = KT_coeff(1,:) .* exp(log_KT);  

 KT = sum(KT);
于 2012-12-03T19:25:28.473 に答える
0

試す ...

KT = KT_coeff(1,1:37) .* const1.^KT_coeff(2,1:37) .* const2.^KT_coeff(3,1:37) .* const3.^KT_coeff(4,1:37) .*  const4.^KT_coeff(5,1:37);

各 KT_coeff のサイズが 2 次元で 37 であることがわかっている場合、上記を置き換えることで、これをもう少し単純化でき1:37ます:

于 2012-12-03T18:09:04.977 に答える