改进MATLAB代码的建议?
我想知道是否有人对改进以下MATLAB代码的性能、表示和/或输出有任何建议 我写了一个程序,用部分和来近似sinx改进MATLAB代码的建议?,matlab,taylor-series,Matlab,Taylor Series,我想知道是否有人对改进以下MATLAB代码的性能、表示和/或输出有任何建议 我写了一个程序,用部分和来近似sinx ((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1)) 使用LS和SL的方法。对于LS,我计算了从最大项到最小项最后的项并求和。对于SL,我按相反的顺序进行了计算 以下是我的功能: function ret = taylorsin(x,n) ret = ((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1)); e
((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1))
使用LS和SL的方法。对于LS,我计算了从最大项到最小项最后的项并求和。对于SL,我按相反的顺序进行了计算
以下是我的功能:
function ret = taylorsin(x,n)
ret = ((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1));
end
我的简短代码是:
function ret = partialsum(x,n,log)
ret = 0;
if log == 1
for i = 0:1:n
ret = ret + taylorsin(x,i);
i=i+1;
end
elseif log == 0
for i = n:-1:0
ret = ret + taylorsin(x,i);
i = i+1;
end
end
end
感谢您的宝贵意见。在第一次观看时,有几件事非常突出:
- 您给循环变量的名称与MATLAB内置变量的名称相同(
)ii
- 您使用的变量名也是MATLAB内置(
)的名称log
- 您正在更改循环内的循环变量(
不是必需的)ii=ii+1
- 您没有在循环中排列
函数(对非内置函数的函数调用可能很难JIT)taylorsin
- 您没有检查变量
的其他值(这会影响您)log
function ret = partialsum(x,n,lg)
ret = 0;
if lg == 1
for ii = 0:n
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
elseif lg == 0
for ii = n:-1:0
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
else
error('Invalid value for lg');
end
但考虑到循环中的计算结果是相同的(只是求和顺序不同),您可以将整个过程矢量化:
function ret = partialsum(x,n,~)
ii = 0:n;
k = 2*ii+1;
ret = x.^k ./ factorial(k) * (-1).^ii.';
end
在第一次观看时,有两件事非常突出:
- 您给循环变量的名称与MATLAB内置变量的名称相同(
)ii
- 您使用的变量名也是MATLAB内置(
)的名称log
- 您正在更改循环内的循环变量(
不是必需的)ii=ii+1
- 您没有在循环中排列
函数(对非内置函数的函数调用可能很难JIT)taylorsin
- 您没有检查变量
的其他值(这会影响您)log
function ret = partialsum(x,n,lg)
ret = 0;
if lg == 1
for ii = 0:n
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
elseif lg == 0
for ii = n:-1:0
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
else
error('Invalid value for lg');
end
但考虑到循环中的计算结果是相同的(只是求和顺序不同),您可以将整个过程矢量化:
function ret = partialsum(x,n,~)
ii = 0:n;
k = 2*ii+1;
ret = x.^k ./ factorial(k) * (-1).^ii.';
end
+1我将使用
repmat
和n
列方式和x
行方式进行向量化,然后使用cumsum
列方式我认为在一般情况下,x
是向量+1我将使用repmat
和n
列方式和x
行方式进行向量化,然后使用cumsum
columnwise我在一般情况下认为x
是一个向量