Replace String Value in Cell with Numerical Value

1 visualización (últimos 30 días)
chris1976
chris1976 el 16 de Feb. de 2018
Comentada: chris1976 el 1 de Mzo. de 2018
Hi all
I like to replace a string value in a cell with a numerical value.
The cell looks like:
A1 = {-1,0,0,0,0,0,0;1,-1,0,0,-1,0,0;0,1,1,-1,0,0,0;0,1,1,-1,0,0,0;0,0,1,0,0,0,0;0,0,0,'C.C4',0,0,0;0,0,0,0,1,1,-1;0,0,0,0,0,1,0;0,0,0,0,0,0,'C.C5'}
I like to replace the string C.C4 and C.C5 with numerical values like: C.C4 = 2; C.C5 = 3;
I already burnt hours on this problem! Thanks a lot for your help (-:
Cheers, Chris
  1 comentario
Guillaume
Guillaume el 16 de Feb. de 2018
Why does 'C.C4' get replaced by 2 and 'C.C5' by 3 (instead of 4 and 5 or something more logical)?

Iniciar sesión para comentar.

Respuesta aceptada

Stephen23
Stephen23 el 19 de Feb. de 2018
Editada: Stephen23 el 19 de Feb. de 2018
A = {'Inf','C.C3','C.C2',1;'-Inf',1,'C.C5','Inf';'C.C4',0,0,'-Inf';0,0,1,'-Inf'};
idn = cellfun(@isnumeric,A); % identify numeric values.
out = nan(size(A)); % preallocate output matrix.
out(idn) = [A{idn}]; % allocate numeric values.
tmp = A(~idn); % subset with char vectors.
vec = str2double(tmp); % attempt to convert to numeric.
idx = isnan(vec); % identify char not converted.
C = {'C.C2','C.C3','C.C4','C.C5','C.C6'};
V = [ 10, 100, 34, 35, 100];
[idm,idc] = ismember(tmp(idx),C); % lookup table.
assert(all(idm),'Not in C:%s',sprintf(' %s,',C{~idm}))
vec(idx) = V(idc);
out(~idn) = vec
giving this numeric matrix:
out =
Inf 100 10 1
-Inf 1 35 Inf
34 0 0 -Inf
0 0 1 -Inf
An alternative to throwing an error for missing C.Cx strings would be to put a NaN in that position:
[idm,idc] = ismember(tmp(idx),C) % lookup table.
tmp = nan(size(idc));
tmp(idm) = V(idc(idm))
vec(idx) = tmp;
out(~idn) = vec

Más respuestas (1)

Guillaume
Guillaume el 16 de Feb. de 2018
Identifying the char elements is easy. And once the rule for replacing them by numbers is known, replacing them is also easy:
toreplace = cellfun(@ischar, A1);
A1(toreplace) = num2cell((1:sum(toreplace(:))) + 1) %arbitrary rule that replace char arrays by numbers 2, 3, 4, ...
After that you probably want
A1 = cell2mat(A1)
  1 comentario
chris1976
chris1976 el 19 de Feb. de 2018
Hi all! Thx for your answers. I couldn't solve my problem yet. I like to specify as follows:
My cell array looks for example like this (mixed string and numeric values out of xlsread):
A1 = {'Inf','C.C3','C.C2',1;'-Inf',1,'C.C5','Inf';'C.C4',0,0,'-Inf';0,0,1,'-Inf'}
I want to replace the following string values (variables) with numeric values for example:
C.C2 = 10 C.C4 = 34 C.C5 = 25 C.C6 = 100
And I like to change the string value "Inf" resp. "-Inf" to numeric Inf and -Inf (infinite and negativ infinite).
I tried with your solutions but couldn't do it - maybe because I specified my problem too little.
Hope you may help! Thx a lot in advance. Cheers, Chris

Iniciar sesión para comentar.

Categorías

Más información sobre Characters and Strings en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by