3 votes

vector Entry lookup in matlab

Étant donné un vecteur U n x 1 qui contient les entrées de 0,1,2,3 Je voudrais créer un autre vecteur V dans le type char, de sorte que l'entrée
0 en U sera "0" dans V
1 dans U sera "1" dans V
2 en U sera "12" dans V
3 dans U sera "123" dans V

Quelle est la meilleure façon de procéder dans matlab plutôt que de scanner chaque entrée individuelle dans le vecteur et d'utiliser ensuite le cas de commutation ?

1voto

b3. Points 5040

Créer un fonction anonyme pour convertir un élément à la sortie souhaitée, puis utiliser ARRAYFUN pour appliquer cette fonction à toutes les entrées :

\>> f = @(x) sprintf('%u', sum(10.^((x-1):-1:0) .\* (1:x)));
>> x = 0:3

x =

     0     1     2     3

>> c = arrayfun(f, x, 'UniformOutput', 0)

c = 

    '0'    '1'    '12'    '123'

1voto

gnovice Points 70970

Je pense que l'approche la plus simple consiste à créer un tableau de cellules "C" contenant vos 4 valeurs de chaîne, puis à indexer le tableau avec U+1 :

>> C = {'0' '1' '12' '123'};  %# Cell array with 4 strings corresponding to 0..3
>> U = [0 1 2 3 2 1 0];       %# Sample U vector
>> V = C(U+1)                 %# Index C with U+1

V = 

    '0'    '1'    '12'    '123'    '12'    '1'    '0'

Et si vous voulez V soit une chaîne de caractères unique au lieu d'un tableau de chaînes de caractères, vous pouvez faire ceci à la place :

>> V = [C{U+1}]

V =

01121231210

1voto

r.m. Points 25280

Vous pouvez facilement définir un ensemble de règles et les indexer.

rules={'0','1','12','123'};
out=rules(A+1)

Dans le texte ci-dessus, A est le vecteur que vous avez.

0voto

HullCityFan852 Points 133

Je dirais qu'il faut créer un hashmap avec l'ensemble des paires que vous avez indiquées. Chaque fois que vous voulez insérer dans V en fonction de U, insérez la valeur associée à la clé qui est la valeur de l'entrée de U dans V. Par exemple, si U[0] = 2, alors faites V[0] = myMap.get(2), ou quelle que soit la syntaxe MATLAB.

-1voto

DarkEnergy Points 1

Voici une version vectorisée qui est idiomatique de Matlab :

Néanmoins, cela revient à effectuer un balayage linéaire quatre fois. Si vous voulez vraiment plus d'efficacité, écrivez une fonction C mex.

V = cell(size(U));
V{U==0} = '0';
V{U==1} = '1';
V{U==2} = '12';
V{U==3} = '123';

Edita:

La solution de gnovice est de loin supérieure. Voir ci-dessus.

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