2011-08-11 7 views
3

Je suis en train de calculer le percentile 99,5% pour un ensemble de données de 100000 valeurs dans un tableau (arr1) dans VBA en utilisant la fonction quantile comme suit:taille du tableau WorksheetFunction limite

Pctile = Application.WorksheetFunction.Percentile(arr1, 0.995) 
Pctile = Application.WorksheetFunction.Percentile_Inc(arr1, 0.995) 

Ni œuvres et moi continuer à obtenir une discordance de type (13).

Le code fonctionne bien si je limite la taille du tableau jusqu'à un maximum de 65536. Pour autant que je connaissais depuis calculation limited by available memory Excel 2007 array sizes when passing to macro limited by available memory depuis Excel 2000.

J'utilise Excel 2010 sur une haute performance serveur. Quelqu'un peut-il confirmer que ce problème existe? En supposant que, je suppose que mes options sont de construire une fonction vba pour calculer le percentile "manuellement" ou sortie dans une feuille de calcul, le calculer et le relire. Y a-t-il des alternatives et qu'est-ce qui serait le plus rapide?

+3

Je peux confirmer le "problème". Il existe une limite de taille de tableau lors du renvoi d'un tableau à partir d'un fichier UDF même dans Excel 2007/2010. Je n'ai pas d'autres liens pour vous, donc c'est juste un commentaire. Enfin, je ne pouvais pas voir dans les liens que vous avez posté quelque chose qui suggère la limite de taille de tableau * pour les valeurs de retour d'un UDF * est limitée par "mémoire disponible". – jtolle

+0

j'ai aussi l'erreur de type de moulage quand il va à de grandes données –

Répondre

0

Voici un exemple VBA classique qui imite la fonction Excel Percentile.

Percentile and Confidence Level (Excel-VBA)

À la lumière de l'exposition de Jean de la méthode Straight Insertion étant inefficace. J'ai édité cette réponse avec le suivant:

J'ai lu que QuickSelect semble exceler avec de grands disques et est très efficace en faisant ainsi.

Références:

  1. Wikipedia.org: Quick Select
  2. Une implémentation C# peut trouver @Fast Algorithm for computing percentiles to remove outliers qui devrait être facilement converti en VB.
+2

Attention! Il utilise [tri par insertion directe] (http://en.wikipedia.org/wiki/Insertion_sort)! L'insertion directe est une routine N², et ne doit être utilisée que pour un petit N par ex. N <20, pas N = 100000 pour lequel il sera très inefficace. –

+0

Merci JFC. Je me concentre ici sur la minimisation de l'exécution autant que possible. Pouvez-vous suggérer une alternative? – kavmeister