matlab loops/if statements help for a beginner

1 visualizzazione (ultimi 30 giorni)
Hello!I know that my code is totally wrong, but since i do not have a teacher I would like some help, in order to learn to think correctly. I have to do this exercise Write a function called max_sum that takes v, a row vector of numbers, and n, a positive integer as inputs. The function needs to find the n consecutive elements of v whose sum is the largest possible. In other words, 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. If multiple such sequences exist in v, max_sum returns the first one. 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. If the input n is larger than the number of elements of v, the function returns 0 as the sum and -1 as the index.
This is my code.
function [summa,index]=max_sum(v,n)
m=size(v);
if n>m
summa=0;
index=-1;
elseif n<- m
for v1=v(1:n-1:m)
summa=sum(max(v1));
index=v1(1);
end
end
  2 Commenti
Renato SL
Renato SL il 8 Ott 2019
A few things:
  1. m = size(v); If want you want is the length of the vector, you may want to use m = length(v) instead. Otherwise, keep it, but then on the next operations, use m(2) instead since m contains both width & length of v.
  2. You may need to recheck the elseif statement. I think what you want is <= (less than or equal to)
  3. You need a third end, which is for the function.

Accedi per commentare.

Risposta accettata

David K.
David K. il 8 Ott 2019
So problem 1 is that size is outputting a vector and not a single value. It outputs both dimensions so for your example m is [1 9] which will not work in the if statements as written. Since you know v is a vector then the easiest change here is to change that line to
m = length(v); % outputs 9, the longest dimension
2) in your elseif you have n<-m which makes no sense. I expect you might have meant n<=m but that is really unnecessary anyways and you can remove that entirely to just be an else statement.
3) I do not know what you are trying to do with
v1=v(1:n-1:m)
but I do not think it will work. I would do it as such:
else
summa = 0;
for v1=1:m-n+1 % v1 will loop through 1 2 3 4 5 6 7 in the example
if summa < sum(v(v1:v1+n-1)) % this will sum the 3 consecutive values and check if it is larger than the previous largest summa
summa = sum(v(v1:v1+n-1)); % save the sum as summa
index=v1:v1+n-1; % save the indices that made it
end
end
end
For index do you want the output to be the actual indices [4 5 6] that the largest values occur or the largest values. If you want the largest values and not the indices simply replace the line with this:
index=v(v1:v1+n-1);

Più risposte (1)

ERTIZA HOSSAIN SHOPNIL
ERTIZA HOSSAIN SHOPNIL il 19 Ago 2020
function [summa,index]= max_sum(v,n)
m=length(v);
if m<n
summa=0;
index=-1;
else
summa = 0;
for i=1:m-n+1
if summa < sum(v(i:i+n-1))
summa = sum(v(i:i+n-1));
index=i;
end
end
end
end

Community Treasure Hunt

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

Start Hunting!

Translated by