1

MATLAB 的语法与传统的 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 风格的程序中很少使用循环。这样做的原因是,虽然我的第二个解决方案执行了更多操作,但实际上它更快,因为处理器处的缓存更优化、并行化以及其他可能的优化在后台静默完成。

更新:(关于repmat的解释)

我认为 repmat 是“复制矩阵”的缩写。它的真正作用最好用两个典型的例子来解释:

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

尝试 ...

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 在第二维中的大小为 37,您可以通过替换1:37:上面的内容来进一步简化这一点。

于 2012-12-03T18:09:04.977 回答
0

我会避免所有这些指数,先取一个日志,然后再取一个 exp。

    % // 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 回答