How to replace elements of a cell array using a containers.Map

12 visualizaciones (últimos 30 días)
I have a cell array of VariableNames that Matlab created when reading a csv file. I want to change them to my own choice of names however, the order of the names is not guaranteed.
iddata = readtable('data.csv');
var_names = iddata.Properties.VariableNames;
names_to_replace = {'TonnageDeBSA', 'D__bitD___eauAuBSA', ...
'PressionPalierSAG', 'PuissanceSAG'};
replacements = {'TonnageBSA', 'DebitEauBSA', ...
'PressionPalierSAG', 'PuissanceSAG'};
replace_map = containers.Map(names_to_replace, replacements);
Obviously I could use a for loop:
new_var_names = {};
for i=1:numel(var_names)
new_var_names(i) = {replace_map(var_names{i})};
end
But I am hoping there is an easier way.
Does MATLAB have anything like a list comprehension in Python?
new_var_names = {replace_map[name] for name in var_names}
Even better if there is a way to handle failed matches:
new_var_names = {replace_map[name] for name in var_names if name in replace_map}

Respuesta aceptada

Puru Kathuria
Puru Kathuria el 31 de En. de 2021
You might want to try out arrayfun, which can help you in applying a function to each element of array.
Otherwise, you can also do the above mentioned operation traditionally using for loop.
  2 comentarios
Bill Tubbs
Bill Tubbs el 31 de En. de 2021
I couldn't get arrayfun to work but cellfun does.
Is this what you meant?
new_var_names = cellfun(@(s) replace_map(s), var_names, 'UniformOutput', false)
per isakson
per isakson el 1 de Feb. de 2021
Editada: per isakson el 1 de Feb. de 2021
Most likely, yes. Had the texts been stored in string arrays then arrayfun had done the job.

Iniciar sesión para comentar.

Más respuestas (1)

per isakson
per isakson el 1 de Feb. de 2021
With string and arrayfun on R2018b
%%
names_to_replace = ["TonnageDeBSA", "D__bitD___eauAuBSA", ...
"PressionPalierSAG", "PuissanceSAG"];
replacements = ["TonnageBSA", "DebitEauBSA", ...
"PressionPalierSAG", "PuissanceSAG"];
replace_map = containers.Map( names_to_replace, replacements );
%%
var_names = names_to_replace( randi([1,4],1,8) ); % test data
new_names = arrayfun( @(key) replace_map(key), var_names, "uni", false );
reshape( new_names, [],1 )
outputs
ans =
8×1 cell array
{'PuissanceSAG' }
{'DebitEauBSA' }
{'PressionPalierSAG'}
{'TonnageBSA' }
{'PuissanceSAG' }
{'DebitEauBSA' }
{'PressionPalierSAG'}
{'PressionPalierSAG'}
>>
Surprise, I expected a string array as output. containers.Map (R2018b) doesn't seem to fully support strings.
  1 comentario
Bill Tubbs
Bill Tubbs el 1 de Feb. de 2021
Thanks, but the original source of the names is a cell array (from table.Properties.VariableNames) so I think cellfun is the best option as per my comment on the other answer.

Iniciar sesión para comentar.

Categorías

Más información sobre Structures 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