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标量。
答案 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);