Borrar filtros
Borrar filtros

multiple switch-case, get position value

3 visualizaciones (últimos 30 días)
Elysi Cochin
Elysi Cochin el 3 de Oct. de 2017
Comentada: Walter Roberson el 3 de Oct. de 2017
switch var
case {'ABC' 'ADE' 'AFG' 'AHI'}
Str = 'A';
case {'BAC' 'BDE' 'BFG' 'BHI'}
Str = 'B';
end
The above is my switch-case condition. Is there a way if i select
"ADE" The Str should be "A", and the pos should 2.
"BHI" The Str should be "B", and the pos should 4.
Is there a way i can do to get the position, or should i write switch-case again

Respuesta aceptada

Guillaume
Guillaume el 3 de Oct. de 2017
switch ... case (or if ... elseif ...) statements are simple to understand and are great for beginners, but are very limited. To do what you want with a switch you'd have to split each of your case statement into 4, so you'd have
switch var
case 'ABC'
Str = 'A'; pos = 1;
case 'ADE'
Str = 'A'; pos = 2;
...etc
A much simpler way to do what you want is not to use switch at all, and just use look-up tables:
lookuptable = {{'ABC' 'ADE' 'AFG' 'AHI'}, 'A';
{'BAC' 'BDE' 'BFG' 'BHI'}, 'B'};
for row = 1:size(lookuptable, 1)
[found, pos] = ismember(var, lookuptable{row, 1});
if found
Str = lookuptable{row, 2};
break;
end
end
if found
fprintf('"%s" found, Str is "%s" and pos is %d\n', var, Str, pos);
else
fprintf('"%s" not found\n', var);
end
  1 comentario
Walter Roberson
Walter Roberson el 3 de Oct. de 2017
[tf, idx] = ismember(Str, lookuptable(:,2));
if tf
var = lookuptable{idx,1}{pos};
else
var = '';
end

Iniciar sesión para comentar.

Más respuestas (2)

KSSV
KSSV el 3 de Oct. de 2017
str = {'ABC' 'ADE' 'AFG' 'AHI'} ;
pos = 1:length(str) ;
idx = pos(strcmp(str,'ADE'))
  1 comentario
Guillaume
Guillaume el 3 de Oct. de 2017
ismember is simplet for that:
[found, pos] = ismember('ADE', str)

Iniciar sesión para comentar.


Walter Roberson
Walter Roberson el 3 de Oct. de 2017
Provided that you can sort the cases by initial letter and all the entries with the same initial letter are to be considered together,
cases = {'ABC' 'ADE' 'AFG' 'AHI', 'BAC' 'BDE' 'BFG' 'BHI'};
[vars, startpos, uidx] = unique( cellfun( @(V) V(1), cases ), 'stable');
Then,
[tf, idx] = ismember(var, cases);
if tf
groupidx = uidx(idx);
Str = vars(groupidx);
pos = idx - startpos(groupidx) + 1;
else
Str = ''; pos = [];
end

Categorías

Más información sobre Nonlinear Optimization en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by