假设有以下matlab代码
function dp = derp(p)
n = length(p) - 1;
p = p(:)';
dp = p(1:n).*(n:-1:1);
k = find(dp ~= 0);
if ~isempty(k)
dp = dp(k(1):end);
else
dp = 0;
end
正如我从书中所知,我从这里得到了这段代码,它只是计算出函数的导数,多项式的导数,但是如果我想用c ++编写它,如何重写它?请解释一下这段代码的想法,我只需要在matlab中完全理解它做了什么,暂时让我们忘记c ++并注意代码的主要思想,请大家帮助我,我知道,算法,mathematicaly如何派生计算,我需要在代码中理解
答案 0 :(得分:2)
此函数将多项式的系数作为其输入p
。
给定一些多项式函数:
zx^n + yx^(n-1) + ... + cx^2 + bx + a
p = [z y ... c b a]
给定这些系数和相应的指数[0 1 2 3 ...]
,我们有一个算法来获取多项式的导数(你知道)。对于多项式中的每个项:
所以...这就是你的代码所做的!我会(几乎)逐行完成它:
function dp = derp(p)
n = length(p) - 1;
n是导数的长度(项数),它只比输入多项式小1,因为常数项消失(相应的指数为零)。这也是输入多项式的 order (最高指数值)。
p = p(:)';
这只是转置输入向量。我...不确定为什么在你的代码中完成,似乎没必要。
dp = p(1:n).*(n:-1:1);
此处每个系数p(1:n)
乘以其术语(n:-1:1)
的指数。
k = find(dp ~= 0);
这将搜索系数不为零的任何索引,并将这些索引存储在k
中。
if ~isempty(k)
dp = dp(k(1):end);
else
dp = 0;
end
此if语句将dp
设置为从第一个非零系数开始的导数系数。如果所有计算的系数都为零(输入函数是常数),则dp仅设置为零。
希望这有帮助!
答案 1 :(得分:2)
多项式表示为系数列表。
确保p是行向量。
p = p(:)';
将每个元素乘以它的索引
dp = p(1:n).*(n:-1:1);
从列表前面删除任何零项
k = find(dp ~= 0);
if ~isempty(k)
dp = dp(k(1):end);
else
dp = 0;
end
在C中,你可能会这样写:
void derivative(const double *poly, int polysize, double *dervpoly)
{
for (int i=0 ; i<polysize-1 ; i++)
dervpoly[i] = poly[i]*(polysize-i-1);
}
调用者负责为dervpoly分配大小为polysize-1
的数组。
多项式是:
poly[0]*x^(polysize-1) + poly[1]*x^(polysize-2) + .. + poly[polysize-2]*x + poly[polysize-1]
请注意,以相反的顺序存储系数可能更方便。