Find the first element that satisfy a condition in a vector

Hello! I have a homework: if v is [1 2 3 4 5 4 3 2 1] and n is 3, it will find 4 5 and 4 because their sum of 13 is the largest of any 3 consecutive elements of v. The function returns summa, the sum as the first output argument and index, the index of the first element of the n consecutive ones as the second output.
for example
  • [summa, index] = max_sum([1 2 3 4 5 4 3 2 1],3)
  • summa = 13
  • index = 4
  • [summa, index] = max_sum([1 2 3 4 5 4 3 2 1],1)
  • summa = 5
  • index = 5
  • [summa, index] = max_sum([1 2 3 4 5 4 3 2 1],9)
  • summa = 25
  • index = 1
Then I have written the code. The summa Part is correct but the index part ist wrong. index is always equal to v(k-n+1). Could someone give me some idea?
Here is the result of my code:
  • max_sum([1 2 3 4 5 4 3 2 1],1)
  • summa =5
  • index =1
function [summa,index] = max_sum(v,n)
k = length(v);
a = zeros(1,k-n+1);
if isscalar(n) == 1 && n > 0 && n == round(n)
if n <= k
for ii = 1:(k-n+1)
b = sum(v(ii:ii+(n-1)));
a(ii) = b;
summa = max(a);
end
index = v(ii);
else
summa = 0;
index = -1;
end
else
fprintf('wrong');
end

6 comentarios

dpb
dpb el 19 de Mzo. de 2019
You don't set index until after the loop finishes so ii is always the max it takes on in the loop...
Would be easier to compute all the sums first, then figure out which one of those is the winner...
Points for having "shown your work!" and having made the effort...
could you give me some details?
I have written another code, but the result of my code is also wrong, when n = 2
  • max_sum([1 2 3 4 5 4 3 2 1], 2)
  • summa =5
  • index =5
I ' m block on this part
function [summa,index] = max_sum(v,n)
k = length(v);
a = zeros(1,k-n+1);
if isscalar(n) == 1 && n > 0 && n == round(n)
if n <= k
for ii = 1:(k-n+1)
b = sum(v(ii:ii+(n-1)));
a(ii) = b;
summa = max(a);
if b == summa
index = v(ii);
end
end
else
summa = 0;
index = -1;
end
else
fprintf('wrong');
end
finally! I finished
Hey, I can't manage with it, how did you do ?

Iniciar sesión para comentar.

 Respuesta aceptada

Andrei Bobrov
Andrei Bobrov el 20 de Mzo. de 2019
Editada: Andrei Bobrov el 20 de Mzo. de 2019
function [summa, index] = max_sum(A,n)
B = movsum(A(:),[0 n-1]);
summa = max(B);
index = find(summa == B);
end
or without movsum:
function [summa, index] = max_sum(A,n)
B = A((1:n) + (0:numel(A)-n)');
summa = max(B);
index = find(summa == B);
end

1 comentario

dpb
dpb el 20 de Mzo. de 2019
I'm guessing if OP turns this one in, the instructor eyebrows will raise -- or at least they should! :)

Iniciar sesión para comentar.

Más respuestas (1)

function [summa,index]=max_sum(v,n)
k=length(v);
index=ones(1,1);
if n<=k
for i=1:(k-n+1)
b=sum(v(i:i+n-1));
a(i)=b;
summa=max(a);
end
x=find(a==summa);
[o,p]=size(x);
if p~=1
index=x(1);
else
index=x;
end
else
summa=0;
index=-1;
end
end

Categorías

Preguntada:

el 19 de Mzo. de 2019

Respondida:

el 6 de Sept. de 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by