1

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

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

4 回答 4

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是你需要的,所以只需将它分配给finHourNumbspresto!

于 2013-06-30T08:28:38.320 回答
1

一个简单的谷歌搜索返回了许多将罗马数字转换为阿拉伯数字的方法,其中这一种似乎是最简单的。

这只是一个字符串要转换,如果你有一个字符串数组(在 a 中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);
于 2013-06-29T08:08:17.407 回答
1

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

str2double 文档页面说明了要求:

该字符串可能包含数字逗号(千位分隔符)、小数点、前导+-号、在 10 次方比例因子之前的e和表示复杂单位的i

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

里面没有提到罗马数字。

于 2013-06-29T04:35:59.457 回答
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);
于 2013-06-29T21:02:27.757 回答