arrays - 计算数组中接下来的 n 个元素的乘积

标签 arrays matlab matrix multiplication sliding-window

我想计算矩阵的下一个 n 相邻元素的乘积。要相乘的元素的数量 n 应该在函数的输入中给出。 例如,对于此输入,我应该从第一个开始计算每 3 个连续元素的乘积。

[p, ind] = max_product([1 2 2 1 3 1],3);

这给出 [1*2*2, 2*2*1, 2*1*3, 1*3*1] = [4,4,6,3]

有什么实用的方法吗?现在我使用:

for ii = 1:(length(v)-2)
    p = prod(v(ii:ii+n-1));
end

其中 v 是输入向量,n 是要相乘的元素数。

在此示例中 n=3 但可以取任何正整数值。

根据 n 是奇数还是偶数或者 length(v) 是奇数还是偶数,我有时会得到正确的答案,但有时会得到错误的答案。
例如参数:

v = [1.35912281237829 -0.958120385352704 -0.553335935098461 1.44601450110386 1.43760259196739 0.0266423803393867 0.417039432979809 1.14033971399183 -0.418125096873537 -1.99362640306847 -0.589833539347417 -0.218969651537063 1.49863539349242 0.338844452879616 1.34169199365703 0.181185490389383 0.102817336496793 0.104835620599133 -2.70026800170358 1.46129128974515 0.64413523430416 0.921962619821458 0.568712984110933] 
n = 7

我得到错误:

Index exceeds matrix dimensions.
Error in max_product (line 6)  
p = prod(v(ii:ii+n-1));

有什么正确的通用方法吗?

最佳答案

基于 Fast numpy rolling_product 中的解决方案,我想推荐它的一个 MATLAB 版本,它利用了 movsum R2016a中引入的功能。

数学推理是数字的乘积等于它们的对数和的指数:

enter image description here

上述内容的可能 MATLAB 实现可能如下所示:

function P = movprod(vec,window_sz)
  P = exp(movsum(log(vec),[0 window_sz-1],'Endpoints','discard'));
  if isreal(vec)   % Ensures correct outputs when the input contains negative and/or
    P = real(P);   %   complex entries.
  end
end

几点说明:

  1. 我没有对这个解决方案进行基准测试,也不知道它在性能方面与其他建议相比如何。
  2. 它应该可以正确处理包含零和/或负数和/或复数元素的向量。
  3. 它可以很容易地扩展以接受一个维度来操作(对于数组输入),以及 movsum 提供的任何其他定制。 .
  4. 假定第一个st 输入是doublecomplex double row 向量。
  5. 输出可能需要四舍五入。

关于arrays - 计算数组中接下来的 n 个元素的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39317904/

相关文章:

ios - Swift 数组未附加到

python - Sphinx matlab文档错误: missing module 'std'

c++ - 如何解决 "Undeclared identifier error" block 中的 "if"?

image - 神经网络训练图像的目标向量如何设置?

python - 如何生成特定形式的 NxN 矩阵

javascript - 通过每个下划线获取数组的键和值

for 循环/数组插入和构造中的 if 语句出现 JavaScript 错误

r - 来自两个独立数据帧的距离矩阵

c - 为什么我的用户定义函数在没有 return 语句的情况下也能工作?

c - 输入由空格分隔的 int 并将它们传递给 int 数组