我有一个向量和一个标量作为问题的输入,问题是计算n个连续数量的向量的最大乘积并输出乘积和向量元素的索引作为第一项产品。 例如,载体= [1 2 3 4 5 6],n = 3 我应该得到'3'(即n)连续数量的矢量,其产品是最大的。
在这种情况下,它将是4 * 5 * 6 所以输出将是120和4作为索引。 现在,如果vector少于'n'个元素,则函数outputon返回0和-1作为输出。 我需要有关如何实现这一目标的想法
答案 0 :(得分: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
答案 1 :(得分:1)
您可以在raryeng的答案中为问题Matrix with sliding window elements创建移动窗口,然后在列上创建appyl 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
的长度是否大于
答案 2 :(得分:-1)
您可以计算向量的元素对数,因此乘法变为加法;滑动添加只是卷积,窗口为:
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