2013-08-01 4 views
1

J'espère que quelqu'un pourra me montrer une façon plus efficace d'écrire mon code dans mathematica.Codage efficace en utilisant Position dans Mathematica

J'ai une table qui a une colonne de temps (absolu) et une deuxième colonne contenant une chaîne de caractères associée à la période de temps entre l'heure sur la même ligne et l'heure sur la ligne ci-dessous. Ces temps sont tous régulièrement espacés. J'ai également une deuxième liste de temps irréguliers et je veux avoir une liste des chaînes qui seraient associées à cette période.

Je l'ai fait en utilisant ce code:

regulartime={{1800,a},{3600,b},{5400,b}} 
irregtime={2054,2817,3060,4594, 5123} 


flooredtimes=Floor[irregtime,1800] 
position=Table[Position[regulartime,flooredtimes[[i]]],{i,Length[flooredtimes]}] 
lastlist=Table[regulartime[[position[[i,1,1]],2]],{i,Length[flooredtimes]}] 

Ce produit une liste {a, a, a, b, b} que je peux combiner ensuite avec ma liste des heures irrégulières. Mon problème est que j'essaie de le faire pour de longues (~ 500 000) listes et cela prend beaucoup de temps, y at-il une meilleure façon de le faire? Merci d'avance pour votre aide!

Répondre

2

voici deux idées ..

Function[ ireg, 
     [email protected]@ 
      Select[regulartime, #[[1]] == Floor[ireg, 1800] &]] /@ irregtime 


(*{a, a, a, b, b}*) 



[email protected][[Floor[#, 1800]/1800]] & /@ irregtime 

(*{a, a, a, b, b}*) 
+0

Cela a fonctionné très bien, merci! – user2642620

+0

george, pourriez-vous s'il vous plaît envisager de diriger de nouveaux utilisateurs comme @ user2642620 vers [le site dédié?] (Http://mathematica.stackexchange.com) –

0

Voici une variante de la deuxième méthode de george:

regulartime[[Quotient[#, 1800], 2]] & /@ irregtime 
{a, a, a, b, b} 

Sachez que vous obtiendrez une erreur avec des valeurs moins de 1800; vous pouvez gérer que séparément:

time[x_ /; x >= 1800] := regulartime[[Quotient[x, 1800], 2]] 
time[else_] := Missing[] 

time /@ {356, 3060, 4594} 
{Missing[], a, b} 
Questions connexes