编写乘法MATLAB样式

时间:2012-12-03 17:57:02

标签: matlab

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标量。

3 个答案:

答案 0 :(得分: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]    

答案 1 :(得分: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替换为上面的:来进一步简化此操作。

答案 2 :(得分: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);