2009-07-26 10 views
5

Mathematica'da, listedeki tüm tam sayıların belirlenmiş bir sayıdan daha az olup olmadığını belirlemek için bir yol var mı? Örneğin, bir listedeki tüm sayıların 10'dan küçük olup olmadığını öğrenmek istersem, 10:Mathematica: Bir listedeki tüm tam sayıların bir sayının altında olup olmadığını belirleme?

theList = {1, 2, 3, 10}; 
magicFunction[theList, 10]; --> returns False 

Yardımlarınız için teşekkür ederiz. Listedeki en büyük sayıyı döndüren listeler için Max function'a bakın.

cevap

7

Buradan, bu değerin belirli bir sayıdan az olup olmadığını kontrol edebilirsiniz.

+0

Teşekkürler, iyi fikir. – Nope

+0

Sadece hecelemek için: 'magicFunction [lst_, val_]: = Max [lst] dreeves

3

Bu tür test 'Katlama' kullanarak inşa etmek kolaydır:

magicFunction[ lst_, val_ ] := 
Fold[ ((#2 < val) && #1) &, True, lst ] 

ifade '(2. < val)' her liste elemanının test ('# 2'). Burada istediğiniz herhangi bir testi koyabilirsiniz, böylece Max gibi listable bir fonksiyonla yapabileceğinizden daha güçlü testler yapabilirsiniz.

'& & # 1' daha sonra, mevcut öğeniz için sonucu önceki tüm öğelerin sonucuyla birleştirir.

Ve 'Doğru' temel durumdur - boş bir liste için sonuç. Benim çözüm bana önceki iki çözüm yorum yapmalarına izin veren önce

In[10]:= magicFunction[ {a, b, c}, 10 ] 

Out[10]= c < 10 && b < 10 && a < 10 
6

:

bazı tanımsız değerler geçmek ve ifade genişler görebilirsiniz, nasıl çalıştığını görmek için. Joey Robert'ın çözümü magicFunction1 ve Eric'in çözümü magicFunction2'yi arayalım.

magicFunction1 çok kısa ve zariftir. Bu konuda sevmediğim şey, çok büyük bir sayı listesine sahip olduğum ve birincisinin 10'dan büyük olduğu halde, hala gerekli olmayan en büyük sayıyı bulmakla ilgili tüm çalışmaları yapacağım. Ben

In[1]:= data = Table[RandomInteger[{1, 10}], {10000000}]; 

In[2]:= Timing[magicFunction1[data, 10]] 
Out[2]= {0.017551, False} 

In[2]:= Timing[magicFunction2[data, 10]] 
Out[2]= {10.0173, False} 

In[2]:= Timing[magicFunction3[data, 10]] 
Out[2]= {7.10192, False} 

In[2]:= Timing[magicFunction4[data, 10]] 
Out[2]= {0.402562, False} 

Dolayısıyla benim en iyi yanıt magicFunction4 olduğunu bulduk kriter yapmak

magicFunction3[lst_, val_] := 
Position[# < val & /@ lst, False, 1, 1] == {} 

ve

magicFunction4[lst_, val_] := 
Cases[lst, x_ /; x >= val, 1, 1] == {} 

: Bu aynı zamanda magicFunction2

için geçerlidir aşağıdaki iki çözüm geliştirdi ama hala neden magicFunction1'den daha yavaş olduğunu bilmiyorum. MagicFunction3 ve magicFunction4 arasında neden böyle büyük bir performans farkının olduğunu da görmezden geliyorum.

+1

Max'in zamanlaması ve magicFunction4, Max'in bir yerleşkeden kaynaklanmış olabileceğinden ... gerçekten emin değilim. – Nope

+1

gerçekten ölçüm için ekstra artı – nes1983

İlgili konular