2 votes

Rendre les vecteurs de longueur inégale égaux en réduisant la taille du plus grand d'entre eux.

Je lis 5 colonnes d'un fichier .txt vers 5 vecteurs.

Parfois, certains vecteurs ont un élément de plus que d'autres, je dois donc vérifier s'ils sont tous de longueur égale, et si ce n'est pas le cas, je dois trouver lesquels sont les plus grands et supprimer leur dernier élément. Je pense que je devrais être capable de faire cela sans boucles. Je pensais à l'origine utiliser find en combinaison avec isequal mais isequal ne renvoie qu'une logique, et ne fournit aucune information sur les vecteurs les plus grands.

[Seconds,Sensor1VStatic,Sensor2VPulsed,TemperatureC,RelativeHumidity] = importfile(path);

Ensuite, en fonction des vecteurs qui sont plus longs d'un élément, je ferai par exemple

Seconds(end) = [];
Sensor1VStatic(end) = [];

Si Seconds et Sensor1VStatic sont plus longs d'un élément que les autres vecteurs

3voto

Floris Points 31305

Supposons que vos vecteurs soient dans un tableau de cellules. A :

A = {[1 2 3], [1 2 3 4], [1 2 3 4 5]};

Vous pouvez obtenir la taille de chaque vecteur avec

sz = cellfun(@(x)size(x,2), A);

Ce qui donnera (pour l'exemple ci-dessus)

sz = [ 3 4 5]

Maintenant, vous pouvez trouver le vecteur le plus court :

minLength = min(sz);

Et enfin, faites en sorte que tous les vecteurs aient cette longueur :

B = cell2mat(cellfun(@(x)x(1:minLength), A, 'uniformoutput', false))';

Il existe peut-être des moyens plus élégants (et notez que cellfun fait vraiment du "bouclage implicite")

En appliquant ceci à votre exemple (maintenant élargi), vous pourriez probablement attribuer la sortie de importfile directement dans le tableau de cellules - ou vous pouvez le faire dans une ligne séparée :

A = {Seconds,Sensor1VStatic,Sensor2VPulsed,TemperatureC,RelativeHumidity};

Mais tout cela devient beaucoup de travail. Vous pourriez plutôt le faire :

minLength = min(size(Seconds,1), size(Sensor1VStatic,1), size(Sensor2VPulsed,1), ...

Seconds = Seconds(1:minLength);
...

Il est possible de faire preuve d'une certaine ingéniosité, mais cela ne rendra pas les choses plus lisibles et ne fera pas gagner de temps à long terme...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X