如何将此数学公式转换为矢量化MATLAB代码?
a(i) = Sum (Log (b(i) / b(i-1)) - Sum (Log (b(i) / b(i-1)), 10) , 10 )
b
是一个向量和i > 10
。
另外,Sum (d(i),n) = d(i) + d(i-1) + ... + d(i-n+1)
,i > n
答案 0 :(得分:3)
在MATLAB中编写公式之前,您可以执行大量的简化。首先,按如下方式定义函数f(i)
:
f(i) = Log(b(i)/b(i-1)) = Log(b(i)) - Log(b(i-1))
然后,按照您的定义应用Sum
函数,您可以看到许多术语相互抵消:
Sum(f(i),10) = f(i) + f(i-1) + ... + f(i-8) + f(i-9)
= Log(b(i)) - Log(b(i-1)) +
Log(b(i-1)) - Log(b(i-2)) +
... +
Log(b(i-8)) - Log(b(i-9)) +
Log(b(i-9)) - Log(b(i-10))
==> Sum(f(i),10) = Log(b(i)) - Log(b(i-10))
现在,这里有点棘手,因为有两种方法可以解释嵌套的Sum
操作:内部求和变量i
取决于的操作外部求和变量i
,以及外部求和变量i
的内部求和变量i
独立的那个。
i
取决于外部i
... 然后对于外部求和的每个项,从该项的i
的递减值开始计算内部求和。例如,外部求和的第五项看起来像这样:
... + f(i-4) - Sum(f(i-4),10) + ...
因此,a(i)
的等式将简化如下:
a(i) = Sum(f(i) - Sum(f(i),10),10)
= Sum(Log(b(i)) - Log(b(i-1)) - Log(b(i)) + Log(b(i-10)),10)
= Sum(Log(b(i-10)) - Log(b(i-1)),10)
= Log(b(i-10)) - Log(b(i-1)) +
Log(b(i-11)) - Log(b(i-2)) +
... +
Log(b(i-18)) - Log(b(i-9)) +
Log(b(i-19)) - Log(b(i-10))
[b(i-11)*b(i-12)*...*b(i-18)*b(i-19)]
==> a(i) = Log[-----------------------------------]
[ b(i-1)*b(i-2)*...*b(i-8)*b(i-9) ]
这个最终的等式可以在MATLAB中编码如下:
a(i) = log(prod(b(i-(11:19)))/prod(b(i-(1:9))));
i
独立于外部i
... 那么内部求和的结果基本上看起来是相对于外部求和的常数。例如,外部求和的第五项看起来像这样:
... + f(i-4) - Sum(f(i),10) + ...
因此,a(i)
的等式将简化如下:
a(i) = Sum(f(i) - Sum(f(i),10),10)
= Sum(f(i),10) - 10*Sum(f(i),10)
= -9*Sum(f(i),10)
= 9*Log(b(i-10)) - 9*Log(b(i))
==> a(i) = 9*Log(b(i-10)/b(i))
这个最终的等式可以在MATLAB中编码如下:
a(i) = 9*log(b(i-10)/b(i));
答案 1 :(得分:2)
不确定你在这里表达的是什么概念(你的公式没有匹配的括号!)但如果这真的是你想要的,你可以简化如下:
log(b(i:i+9)./b(i-1:i+8))
相当于
diff(log(b(i-1:i+9)))
所以
我会先将b转换为log return:
c = diff(log(b));
然后
a(i+1) = sum( c(i:i+9) - sum(c(i:i+9)));
也许简化了公式,你可以更清楚地看到你想要的东西。
答案 2 :(得分:1)
a(i) = sum( log(b(i-9:i:)./b(i-10:i-1)) - sum(log(b(i-9:i)./b(i-10:i-1))))
考虑Sum(f(i), n)
。它相当于sum(f(i-n+1:i))
。所以Sum(Log(f(i)), n)
是sum(log(f(i-n+1:i)))
(采用元素运算,然后对结果求和)。
修改强>
数学上,不是
Sum(Log(b(i)/b(i-1)), n)
= \sum_{j=0..n-1}(Log(b(i-j)/b(i-j-1)))
= \sum_{j=0..n-1}(Log(b(i-j)) - Log(b(i-j-1)))
= Log(b(i)) - Log(b(i-n))
= Log(b(i)/b(i-n))
...
那么,
a(i) = Sum(Log(b(i)/b(i-1)) - Sum(Log(b(i)/b(i-1)), n) , n)
= Sum(Log(b(i)/b(i-1)), n) - Sum(Sum(Log(b(i)/b(i-1)), n), n)
= Log(b(i)/b(i-n)) - Sum(Log(b(i)/b(i-n)), n)
...
问题在于Sum
的定义。这真的应该指定索引。
内部Sum
索引如何与外部总和相互作用(两者都是i
)。