在for循环中将字符串转换为数字时返回NaN

时间:2016-03-07 15:16:02

标签: regex matlab for-loop cell-array

for n=1:37
    for m=2:71
        rep1 = regexp(Cell1{n,m}, 'f[0-9]*', 'match')
        rep2 = regexp(rep1, '[0-9]*', 'match')
        rep2 = [rep2{:}]
        cln = str2double(rep2)
        Cell2{n,cln} = Cell1{n,m}
    end
end

细胞1是37x71细胞,细胞2是37x71空细胞。

实施例

 Cell1{1,2} = -(f32.*x1.*x6)./v1

如果我单独运行上面的循环的每个部分,该功能按预期工作。但是,当执行整个循环时,它会返回cln作为NaN。

1 个答案:

答案 0 :(得分:2)

您正在获取NaN,因为您的正则表达式与Cell1的某个值不匹配,并返回一个空字符串(str2double转换为NaN)。

但是让我们在这里退一步。您可以在单元格数组上使用regexp,因此无需遍历所有元素。此外,您可以使用look behind assertion查找数字前面的“f”,从而阻止使用regexp两次。

stringNumber = regexp(Cell1, '(?<=f)[0-9]*', 'match', 'once');
numbers = str2double(stringNumber);

然后,您可以检查NaN(isnan(numbers))并仔细查看Cell1的元素,看看为什么正则表达式没有在特定字符串中找到数字。

一旦你解决了问题,就可以像你正在做的那样分配给Cell2

Cell2 = cell(37, 71);
for k = 1:numel(numbers)
    row = mod(k - 1, size(Cell1, 2)) + 1;
    Cell2(row, numbers(k)) = Cell1(k);
end