我正在尝试将字符串的单元格数组转换为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]
我希望它包含字符串以便我可以显示。
先谢谢
答案 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);