The mysterious if

November 22 2012 by
false
Maple

2

On several occasions, while working with lists or Matrices, I have been drawn to using a combination of seq and if, as in the following:

seq(if(a,b,c), i = 1 .. 10 )

This appears to be a powerful approach. Unfortunately, I have not found much documentation on it.

I have been able to pattern-guess to a limited extent for my limited needs.

Would you know of a good place to go for information?

My understanding is: "a" is the conditional statement, "b" is the action if the statement is true, and "c" the action if the statement is false. Is that roughly correct?

Let me gather some examples I have found useful. Feel free to comment, add your own examples, point out limitations, etc..

restart;
# Create a random list and a random Matrix
n := 50:
L := RandomTools:-Generate(list(integer(range=-100..100),n)):
M := Matrix(n,n,RandomTools:-Generate(integer(range=-100..100),makeproc=true)):

# Example 1
# Count how many elements of a list are within a given interval
# In this example I use add instead of seq, using a similar syntax

add(if(L[i] < 0, 1, 0) , i = 1 .. n );

27

# Example 2
# http://www.mapleprimes.com/posts/43630-Finding-The-Set-Of-Prime-Numbers--N
# Stephen Forrest, also comments on efficiency and alternatives

# Make a list of prime numbers

[seq(if(isprime(i),i,NULL), i = 1 .. n )];

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

# Find the prime numbers in a list (returns position)

[seq(if(isprime(L[i]),i,NULL), i = 1 .. n )];

[14, 16, 24, 29, 30, 31, 35, 37, 50]

# Example 3
# http://www.mapleprimes.com/questions/135686-Searching-A-List-For-Two-Consecutive-Elements
# pagan, gives a more general example
# return all indices of a list such that two consecutive elements are any pair of consecutive integers

L := [op(L),1,2,3]: # making sure such occurrences exist

[seq(if(L[i+1]=L[i]+1,i,NULL),i=1..nops(L)-1)];

[51, 52]

# Example 4
# http://www.mapleprimes.com/posts/127832-Deleting-Rows-In-A-Matrix
# In a Matrix delete all rows that have negative entries in the first column

Matrix(<seq(if(M[i,1]>0,M[i,1..-1],NULL),i=1..op([1,1],M))>):
%[1..10,1..10];

I think that these and other examples like these and more should be added to the documentation.