【问题标题】:Effective way to convert/create matrix from mixed cell/string从混合单元格/字符串转换/创建矩阵的有效方法
【发布时间】:2018-04-30 01:29:21
【问题描述】:

有时可能会有多个字符串位于其他位置,因此我需要一种方法来查找元胞数组中的每个人。我有一个像下面这样的单元格数组,我需要一种快速有效的方法来 1)删除空列,2)将包含带有“#”的字符串的单元格转换为“#”之后的数字(6.504),以及最后 3) 创建或将整个元胞数组转换为数据矩阵,如下面的“数据”。有没有聪明的方法来做这一切?任何建议都非常感谢。

array ={ 
    [47.4500]    ''    [23.9530]    ''    [12.4590]
    [34.1540]    ''    [15.1730]    ''    [ 9.6840]
    [45.2510]    ''    [23.3770]    ''    [13.0670]
    [29.9350]    ''    [14.8680]    ''    '# 6.504'}

data =[
        47.4500   23.9530   12.4590
        34.1540   15.1730    9.6840
        45.2510   23.3770   13.0670
        29.9350   14.8680    6.5040]

【问题讨论】:

    标签: matlab


    【解决方案1】:

    混合类型的列很难处理,但如果格式始终遵循正则表达式模式# \d+(?:\.\d+),您可以按照以下方式进行:

    C = { 
      47.4500   ''    23.9530   ''    12.4590
      34.1540   ''    15.1730   ''     9.6840
      45.2510   ''    23.3770   ''    13.0670
      29.9350   ''    14.8680   ''   '# 6.504'
    };
    
    % Get rid of empty columns...
    C(:,all(cellfun(@ischar,C))) = [];
    
    % Convert numeric strings into numeric values...
    C = cellfun(@(x)convert(x),C,'UniformOutput',false);
    
    % Convert the cell matrix into a numeric matrix...
    C = cell2mat(C);
    

    其中convert函数定义如下:

    function x = convert(x)
        if (~ischar(x))
            return;
        end
    
        x = str2double(strrep(x,'# ',''));
    end
    

    【讨论】:

    • 嗨,Tommaso,非常感谢您的建议。但是,我确实收到以下错误消息:错误:文件:script.m 行:18 列:1 在此上下文中不允许函数定义。
    • 你把那个函数放在什么地方了吗?可能在当前脚本的底部或当前工作文件夹中的另一个文件中?
    • 你说得对,我忘记了函数,当我把它放在脚本的底部时,我收到了这条消息:错误:文件:script.m 行:18 列:1 函数定义在这种情况下是不允许的。
    • 以前的函数或类似的东西中可能缺少一些闭包。暂时把它放到一个单独的文件中。
    • 抱歉,如果创建一个名为 Func 的新函数文件,我该如何从脚本中调用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2013-05-28
    • 2021-05-15
    相关资源
    最近更新 更多