Loren on the Art of MATLAB

Turn ideas into MATLAB

Note

Loren on the Art of MATLAB has been archived and will not be updated.

Reversal of Sorts – New in Release R2014b

I wanted to show you a glimpse of some of the new math functionality available in R2014b.

Contents

The Question

Recently on the MATLAB newsgroup, Christoph asked this question:

I have a vector A shown below, which has 6 elements. the elements are already sorted in descending order. now i want to create vector C by deleting elements from A, starting with element a1, until the sum of the vector equals or is smaller the value B

A=
26
23
20
19
15
14
B=70

So, the output should be

C=
20
19
15
14

Any idea how to do this?

My Original Answer

I would do something like this. Get the numbers in increasing order and perform a cumulative sum.

Aflip = flipud(A);
Asums = cumsum(Aflip);

Find the first sum that is GREATER than b. The next element is where you want to start. startIndex = find(Asums > b, 1, 'first');

But things are reversed now. So we need to find the starting index into the original array. Aind = length(A) - startIndex + 1;

Now delete the leading values you don’t want.

Afiltered = A((Aind+1):end);

Solution with R2014b

In R2014b, the function cumsum has a new option, direction. (So do some other functions in the "|cum|" category.) You can specify to do the calculation in the default or 'forward' direction, or in 'reverse'. Here's what the new solution looks like.

A = [
  26
  23
  20
  19
  15
  14];
B = 70;
tmpA = cumsum(A,'reverse')
ind = find(tmpA > B, 1,'last')
C = A;
C(1:ind) = []
tmpA =
   117
    91
    68
    48
    29
    14
ind =
     2
C =
    20
    19
    15
    14

What New Math Have You Enjoyed in R2014b?

Have you had a chance to explore some of the math functionality in R2014b? Which features did you find helpful? Let me know here.




Published with MATLAB® R2014b


  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.