我在Matlab中创建任意长度的多项式函数时遇到问题,当与向量一起用作参数时,它会起作用。
我必须做一个算法,包括并返回一个多项式的值。 贝娄是我的代码:
n = 4 % For simplicity, could be arbitrary positive integer
f = @(x) x.^[0:n] %Coefficients are 1 (for this example), if not, would be multiplied with vector of them
p = @(x) sum(f(x)) %My polynomial
>> p(5)
ans =
781
这就像计划一样。但是因为我需要一个情节,我需要我的多项式能够接收值的向量并返回它们。但是当我这样做时,会弹出一个错误。 例如:
>>p([1 2 3 4])
Error using .^
Matrix dimensions must agree.
Error in @(x)x.^[0:n]
Error in @(x)sum(f(x))
我希望它返回的是一个长度为4的向量,其值为我的多项式[p(1) p(2) p(3) p(4)]
我通过使用for循环创建一个值向量来解决这个问题,但我只是想知道,是否可以更改我的代码,这样可以工作?
答案 0 :(得分:2)
使用行和列向量可以很容易地修复问题,而不是使用两个行向量:
p([1 2 3 4]')
并明确定义要求求和的维度:
p = @(x) sum(f(x), 2)
<强>解释强>
请注意.^
是一个元素明智的操作。 p([1 2 3 4 5])
有效,因为两个行向量都具有相同的大小,但不会返回所需的结果,即它会计算1^0 + 2^1 + 3^2 + 4^3 + 5^4 = 701
。
Matlab自动扩展( in伪matlab代码)
[1 .^ [0 1 2 3 4]
2
3
4]
到
[1 1 1 1 .^ [0 1 2 3 4
2 2 2 2 0 1 2 3 4
3 3 3 3 0 1 2 3 4
4 4 4 4] 0 1 2 3 4]
向后兼容性(2006-2016a)
应更改f
的定义,因为matlab尚不支持automatic arithmetic expansion。
f = @(x) bsxfun(@power, x, 0:n);
向后兼容性(1996-2005)
bsxfun
尚不存在,因此应该诉诸repmat
。