在matlab中将不同的字符转换为数字

时间:2015-08-07 16:30:31

标签: matlab char numbers

Please help me with the following problem:

In matlab, I have an Nx3 char variable, where N can vary depending on the input. Let's say N = 5 and I have the following variable A (5x3 char):

A = [' 1M';
     ' 5D';
     '10Y';
     '15W';
     '20Y']

A总是Nx3,只能选择' D' W'' M',' Y',所以没有微秒。
有没有办法定义一个新变量B,其变量A中的数字为数值,以年为单位表示,即B = [1/12; 365分之5; 10; 15/52; 20]

到目前为止我尝试过的并且没有用(M的例子):

outc = mat2cell(A, ones(size(A,1),1), size(A,2));
for k = 1:length(outc) 
    if  outc{k} = '\w*M' 
        outc{k} = strrep(outc, 'M', '');
        outc2(k) = cellfun(@str2num, outc);
        outc2(k) = outc2(k)./12;
    end
end

Thank you for your help!

2 个答案:

答案 0 :(得分:3)

您可以做的是设置一个将字符映射到数字的查找表。在您的情况下,您的查找表会将'D'映射到365,'W'映射到52,'M'到12和'Y' 1.您可以使用containers.Map轻松完成此操作。具体来说,您可以设置它:

map = containers.Map({'D', 'W', 'M', 'Y'}, {365, 52, 12, 1});

这会将每个字符映射到我们谈到的每个数字。接下来,referencing your previous post,您将字符矩阵的每一行转换为单元格数组。但是,我也trim out any whitespace via strtrim,以便我们的分析更容易:

B = mat2cell(A, ones(size(A,1),1));
B = strtrim(B); %// Trim out whitespace

现在,您所要做的就是遍历每个单元格,将之前的所有字符转换为数字,然后使用最后一个字符并引用我们的查找表来吐出正确的号码:

out = cellfun(@(x) str2num(x(1:end-1)) / map(x(end)), B);

我们得到:

out =

    0.0833
    0.0137
   10.0000
    0.2885
   20.0000

在转换为浮点之前将其与小数形式的实际数字进行比较:

>> out2 = [1/12, 5/365, 10, 15/52, 20]

out2 =

    0.0833    0.0137   10.0000    0.2885   20.0000

对我好看!

复制和粘贴:

A = [' 1M';
     ' 5D';
     '10Y';
     '15W';
     '20Y'];
map = containers.Map({'D', 'W', 'M', 'Y'}, {365, 52, 12, 1});
B = mat2cell(A, ones(size(A,1),1));
B = strtrim(B); %// Trim out whitespace
out = cellfun(@(x) str2num(x(1:end-1)) / map(x(end)), B);

答案 1 :(得分:2)

这是一种类似于@rayryeng's的方法,但是使用正则表达式(regexprep)而不是地图:

B = mat2cell(A, ones(size(A,1),1)); %// convert each line to a cell
B = regexprep(B, {'Y' 'M' 'W' 'D' }, {'' '/12' '/52' '/365'}); %// replace letters
B = cellfun(@str2num, B); %// convert from strings to numbers

有关

A = [' 1M';
     ' 5D';
     '10Y';
     '15W';
     '20Y'];

这给出了

B =
    0.0833
    0.0137
   10.0000
    0.2885
   20.0000