2010-06-01 5 views
1

Cette question est probablement très différente de ce que vous avez l'habitude de lire ici - j'espère que cela peut constituer un défi amusant. J'ai essentiellement un algorithme qui utilise 5 variables (ou plus) pour calculer une seule valeur, appelée outcome. Maintenant, je dois implémenter cet algorithme sur un périphérique embarqué qui n'a pas de limitations de mémoire, mais qui a des contraintes de traitement très dures. Pour cette raison, je voudrais exécuter un moteur de calcul qui calcule outcome pour, disons, 20 valeurs différentes de chaque variable et stocke cette information dans un fichier. Vous pouvez considérer cela comme une matrice 5 (ou plus) -dimensionnelle ou 5 (ou plus) -dimensionnelle, chaque dimension étant longue de 20 entrées.Calcul, stockage et récupération de valeurs vers et à partir d'une matrice N-Dimensionnelle

Dans toute langue moderne, remplir ce tableau est aussi simple que d'avoir 5 (ou plus) for boucles imbriquées. La partie difficile est que j'ai besoin de vider ces valeurs dans un fichier qui peut ensuite être placé sur le périphérique intégré afin que le périphérique puisse l'utiliser comme une table de recherche.

Les questions maintenant, sont les suivants:

  1. Quel est le format (s) peut-être acceptable pour stocker les données?
  2. Quels programmes (MATLAB, C#, etc.) peuvent être les mieux adaptés pour calculer les données ?
  3. C# doit être utilisé pour importer les données sur l'appareil - est-ce possible étant donné votre réponse à # 1?

Edit: Est-il possible de lire mon fichier de table de recherche sans lire le fichier en mémoire? Pouvez-vous expliquer comment cela pourrait être fait en C#?

+0

Un sous-problème intéressant est de sélectionner les 20 valeurs différentes pour chaque variable. Disons que vous effectuez une interpolation linéaire pour obtenir le résultat. Si votre fonction de résultat est linéaire pour une variable sur une large plage pour cette variable et toutes les autres, vous n'avez pas besoin des 20 valeurs. Mais si votre résultat est hautement non linéaire, vous pourriez avoir besoin de plus de 20 pour représenter toutes les possibilités.Pas une réponse - juste une extension de la question originale. – Grembo

Répondre

2

Je commenterai aussi les points 1 et 3. Il peut être préférable d'utiliser un fichier de sortie de largeur fixe plutôt qu'un fichier CSV. Cela peut occuper plus ou moins d'espace qu'un fichier CSV, en fonction des numéros de sortie. Cependant, il a tendance à bien fonctionner pour les tables de recherche, car déterminer où regarder dans un fichier de données de largeur fixe peut être fait sans lire le fichier entier. Ceci est généralement important pour une table de recherche.

Les données de largeur fixe, comme CSV, sont triviales à lire et à écrire. Certains langages orientés maths peuvent offrir une fonctionnalité de manipulation binaire et binaire médiocre, mais il devrait être très facile de convertir les données en largeur fixe pendant l'étape d'importation.

Le numéro 2 est plus difficile de répondre, en particulier sans connaître le type d'algorithme que vous calculez. Matlab et les programmes similaires ont tendance à être génial sur certains types de calculs et ont souvent beaucoup de choses intégrées pour le rendre plus facile. Cela dit, beaucoup de choses mathématiques qui sont construites dans de telles langues sont disponibles pour d'autres langues sous la forme de bibliothèques.

+0

Voulez-vous dire qu'il est possible de lire à partir de mon fichier de table de recherche sans lire le fichier entier en mémoire? Pouvez-vous expliquer comment cela pourrait être fait en C#? –

+0

'System.IO.FileStream.Seek'. La position sera égale à la largeur * ligne + position de la colonne. 'FileStream' a aussi une' Position' que vous pouvez définir directement, qui est implémentée en termes de 'Seek'. – Brian

+0

En aparté, vous voudrez peut-être lire tout le fichier en mémoire de toute façon, car il sera plus rapide de le faire si cela vous convient. Mais la largeur fixe rendra toujours les choses plus propres et probablement (CSV peut avoir de meilleures performances de cache si elle est significativement plus petite) plus rapidement. – Brian

0

Je vais commenter (1) et (3). Tout ce que vous devez faire est de vider les données en tranches. Choisissez une traversée et déchargez les données dans cet ordre. Ecrivez-le comme des nombres délimités par des virgules.

Questions connexes