【问题标题】:adding consecutive numbers in a vector in matlab在matlab中的向量中添加连续数字
【发布时间】:2016-10-04 16:29:18
【问题描述】:

我有一个向量和一个标量作为问题的输入,问题是计算向量的 n 个连续数的最大乘积,并输出乘积和向量的第一项元素的索引产品。 例如向量 =[ 1 2 3 4 5 6] , n=3 我应该得到 '3' (i e n) 连续数的乘积最大的向量。

在这种情况下,它将是 4*5*6 所以输出将是 120 和 4 作为索引。 现在,如果向量的元素少于“n”个,则函数 outputon 返回 0 和 -1 作为输出。 请我需要有关如何实现此目标的想法

【问题讨论】:

    标签: matlab vector product


    【解决方案1】:

    你可以用循环制作一个简单的实现

    a = [1 2 3 4 5 6]
    w = 3
    n = length(a)
    
    maximum = -1
    
    for i = 1:n-w
      p = prod(a(i:i+w))
      if (p > maximum) 
        maximum = p
      end 
    end 
    
    maximum 
    

    或者,您可以使用图像处理调色板中的 nlfilter

    a = []
    w = 3
    
    if (length(a) >= w)
      products = nlfilter(a, [1 w], @(x) prod(x))
      res = max(products)
    else 
      res = -1
    end 
    

    【讨论】:

    • 如果a 包含负数会怎样?您可能想使用-Inf 作为您的最大值。
    • 是的,当然它需要根据边界情况进行一些调整。我认为如果某些数字是负数,我们应该使用绝对值。但是,这在很大程度上取决于问题的真实描述:)
    • 感谢大家的指导,我看看 cmets 看看我能用它们做什么
    • 这是我得到的结果,它看起来不正确,我可以确定问题出在哪里,因为我不太了解代码 >> [maximum,i]= max_product ( [1 2 2 1 3 1],3) 最大值 = 12 i = 3
    • 您的代码格式不正确,我无法理解您的问题:s
    【解决方案2】:

    您可以根据问题Matrix with sliding window elements 的问题的答案创建移动窗口,然后在列上应用cumprod 并获取最大值及其索引。

    myvec = [1 2 2 1 3 1];
    n = 3;
    ind = bsxfun(@plus, 1:n, (0:1:length(myvec)-n).')';
    M = cumprod(myvec(ind));
    [val,its_ind] = max(M(end,:));
    

    你可以用 if 条件来封装它,检查 myvec 的长度是否大于

    【讨论】:

    • 完美运行,但我不理解代码,尤其是 bsxfun 部分。会的。非常感谢
    【解决方案3】:

    您可以计算向量的逐元素对数,因此乘法变为加法;滑动加法只是 卷积 与一个窗口:

    function [m, p] = f(v, n)
    if numel(v) < n
        m = -1;
        p = 0;
    else
        c = conv(log(v(:)), ones(n,1), 'valid'); % convolution with vector of n ones
        [~, m] = max(c); % starting index of maximizing window
        p = prod(v(m+(0:n-1))); % corresponding product
    end
    

    例子:

    >> v = [1 2 3 4 5 6]; n = 3;
    >> [m, p] = f(v,n)
    m =
         4
    p =
       120
    
    >> v = [1 2 3 4 5 6]; n = 7;
    >> [m, p] = f(v,n)
    m =
        -1
    p =
         0
    
    >> v = [1 4 6 2 5 3]; n = 3;
    >> [m, p] = f(v,n)
    m =
         3
    p =
        60
    

    【讨论】:

    • 我很感谢投反对票者的建议,以便我改进我的答案
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多