The mysterious `if`

November 22 2012 PatrickT 1993
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.

Please Wait...