如何将表示罗马数字的字符串单元格数组转换为double?

时间:2013-06-29 04:27:22

标签: matlab roman-numerals

我正在尝试将字符串的单元格数组转换为double,以便我可以使用它。

hourNumbers = {'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'}

finHourNumbs = cell(1,length(hourNumbers))
for i=1:length(hourNumbers)
finHourNumbs {i} = str2double(hourNumbers{i});
end

我得到以下输出,我不希望

finHourNumbs = 

Columns 1 through 9

[NaN]    [NaN]    [NaN]    [NaN]    [NaN]    [NaN]    [NaN]    [NaN]    [NaN]

Columns 10 through 12

[NaN]    [NaN]    [NaN]

我希望它包含字符串以便我可以显示。

先谢谢

4 个答案:

答案 0 :(得分:2)

详细阐述Gunther的解决方案,您需要处理一小部分需要转换为十进制表示的罗马数字,因此您可以使用简单的转换。这是一个使用ismember的快速原生解决方案:

romans = {'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'};
hourNumbers = {'I', 'III', 'XII'}; %// Just a sample input data
[tf, finHourNumbs] = ismember(hourNumbers, romans);

ismember的第二个输出是您所需要的,所以只需将其分配给finHourNumbs并预先确定!

答案 1 :(得分:1)

如果任何srt2dbl类型的转换代码识别出罗马数字,我会非常感到惊讶。我想你可能想先把它们转换成十进制数。

str2double doc page说明要求:

  

字符串可能包含数字逗号(千位分隔符),小数点,前导 + - 签名, e 在10比例因子之前, i 表示复杂单位。

     

如果str不代表有效的标量值,str2double将返回 NaN

那里没有任何罗马数字。

答案 2 :(得分:1)

simple google search返回了将罗马数字转换为阿拉伯数字的大量方法,其中this one似乎是最简单的。

这只是一个要转换的字符串,如果你有一个字符串数组(在cell array中),只需使用一个循环或cellfun

finHourNumbs = cellfun(@roman2arabic, hourNumbers);

或者@EitanT指出,因为你正在处理(一小组)小时数,你也可以使用一个简单的转换数组:

numsRoman = {'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'};
nums=1:numel(numsRoman);

然后:

finHourNumbs = cellfun(@(str) nums(strcmpi(str,numsRoman)), hourNumbers);

答案 3 :(得分:0)

您可以使用containers.Map,并像这样创建自己的roman2double

hourNumbers = {'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'};

roman2double = containers.Map(hourNumbers, 1:12);

finHourNumbs = cell(1,length(hourNumbers));
for i=1:length(hourNumbers)
    finHourNumbs {i} = roman2double(hourNumbers{i});
end

或缩写

hourNumbers = {'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'};
roman2double = containers.Map(hourNumbers, 1:12);
finHourNumbs = values(roman2double, hourNumbers);