I need some help in seeing where I am going wrong and how to proceed with writing a particular funciton for a MATLAB course I am taking please.

조회 수: 3 (최근 30일)
The question is this:
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. Here are a few example runs:
[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],2)
summa = 9
index = 4
THe code I have written so far is as follows. My problem is that I am stuck on obtaining the largest possible sum. I wrote code and have been able to generate different sums in a vector but I am unable to put those answers in a vector themselves, by putting the answers in a vector I want to be able to use the 'max' function to obtain the largest sum. I haven't even touched finding the 'index' portion yet. Here's my code:
function [summa,index] = max_sum(v,n)
r = 0;
summa = zeros(1,length(v)); %% created a vector of 0's to length of v
if n > length(v)
summa = 0;
index = -1;
else
while n <= length(v)
summa = sum(v(r+1:n)) % here need to replace 0's with the sum (with logical index) so i can choose max
r = r+1;
n = n+1;
end
summa = max(summa);
index = n;
end
%summa = v;
%index = n;
end
Again, I need some help because I am unsure how to proceed from here. Thank you.

채택된 답변

James Tursa
James Tursa 2019년 6월 27일
편집: James Tursa 2019년 6월 27일
Some issues:
n is a fixed input ... you should not be changing n inside your function. Get rid of that n = n + 1 statement.
The values you are summing v(r+1:n) isn't correct. You need to be summing n consecutive numbers. So, assuming the first index of these numbers is r, the subset would be v(r:r+n-1)
The loop needs to run as long as that last index of r+n-1 isn't greater than numel(v).
Prior to the loop, you should initialize summa and index to default values (e.g., maybe summa = -inf, or perhaps the sum of the first sequence of numbers in the vector). The summa variable is a scalar value (see the examples), not a vector, so you shouldn't be initializing it to a vector of zeroes.
Inside the loop you should have something like this logic:
if( the sum of the v(r:r+n-1) elements is greater than the current value of summa )
save the sum in summa and save the r in index
end
Give a try at making these changes and then post replies on this thread if you have more problems.
  댓글 수: 2
Alexander Villanueva
Alexander Villanueva 2019년 6월 27일
Thank you for the clarity, I have updated the code and had another issue regarding giving me the first index if there are consecutive sums but I was able to figure that part out. However another issue popped up. The problem is that if 'n' is greater than numel(v), the answer is supposed to be summa = 0 and index = -1. However, when I do a test run where n is greater than the length(v), that answer does not appear, rather it does give summa = 0 and index = -1 but there is also an error that appears alongside it that says "Index exceeds the number of array elements". I thought the reason for having my first "if' statement was to take care of this issue yet it does not appear to be working. Here's the updated code:
function [summa,index] = max_sum(v,n)
r = 1;
summa = 0;
index = 0;
if n >= length(v)
summa = 0
index = -1
else
while n < numel(v)
sum(v(r:r+n-1));
r = r+1;
if sum(v(r:r+n-1)) == sum(v(r-1:r-1+n-1))
r=r-1;
break
elseif sum(v(r:r+n-1)) > sum(v(r+1:r+1+n-1))
break
end
end
end
index = r;
summa = sum(v(r:r+n-1));
end
James Tursa
James Tursa 2019년 6월 27일
편집: James Tursa 2019년 6월 27일
This:
if n >= length(v)
should be this:
if n > length(v)
This:
while n < numel(v)
doesn't match my suggestion:
while( that last index of r+n-1 isn't greater than numel(v) )
And this:
if sum(v(r:r+n-1)) == sum(v(r-1:r-1+n-1))
doesn't match my suggestion either:
if( the sum of the v(r:r+n-1) elements is greater than the current value of summa )
Also, your entire if-elseif-end block is more complicated than my suggestion of a simple if-end block, so look at that again.
So, take a look at fixing these up and then get back to us with your progress.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Mukti Awad
Mukti Awad 2019년 8월 16일
I am getting this error while executing code
  • Assessment result: incorrect[1 2 3 4 5 4 3 2 1]max_sum([ 1 2 3 4 5 4 3 2 1 ], 10) returned the following MATLAB error: Index exceeds the number of array elements (9).
  • Assessment result: incorrectrandom vectorsVariable summa has an incorrect value. max_sum([ 71 -54 17 60 -51 -3 98 -65 -61 35 90 94 -11 -69 82 -86 -12 ], 5) returned sum = 121 and index = 3 which is incorrect...
  댓글 수: 2
James Tursa
James Tursa 2019년 8월 16일
Probably best if you open up a new Question. Also, we can't help you correct your code unless we see your code, so post your current code along with your Question.
Mukti Awad
Mukti Awad 2019년 8월 18일
Code is here:
function [summa,index] = max_sum(v,n)
r = 1;
summa = 0;
index = 0;
if n > length(v)
summa = 0;
index = -1;
else
while n < numel(v)
sum(v(r:r+n-1));
r = r+1;
if sum(v(r:r+n-1)) == sum(v(r-1:r-1+n-1))
r=r-1;
break
elseif sum(v(r:r+n-1)) > sum(v(r+1:r+1+n-1))
break
end
end
end
index = r;
summa = sum(v(r:r+n-1));
end
Getting error:
Assessment: 0 of 2 Tests Passed
More Info
Assessment result: incorrect[1 2 3 4 5 4 3 2 1]
max_sum([ 1 2 3 4 5 4 3 2 1 ], 10) returned the following MATLAB error:
Index exceeds the number of array elements (9).
Assessment result: incorrectrandom vectors
Variable summa has an incorrect value.
max_sum([ -81 -77 -45 -68 7 85 -9 30 89 62 83 83 94 -77 52 43 -62 -76 -2 26 -80 ], 2) returned sum = 92 and index = 5 which is incorrect...

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by