【问题标题】:Matlab: convert NaNs from xlsread to blankMatlab:将 NaN 从 xlsread 转换为空白
【发布时间】:2015-10-24 20:31:58
【问题描述】:

SOM 2.1 工具箱存在 NaN 问题。 下面的代码仅适用于元胞数组,不适用于双精度数字数组。

[D, headers] = xlsread('Workbook2.xlsx', 'Sheet1', 'A2:BE101');
idx    = isnan(D);
D(idx) = {[]}

The following error occurred converting from cell to double:
Error using double
Conversion to double from cell is not possible.

有什么建议吗?

【问题讨论】:

    标签: matlab nan


    【解决方案1】:

    首先你不能这样做:D(idx) = {[]} 如果你有一个双数组。

    那么,isnan 不适用于元胞数组。考虑以下单元格:

    a = cell(2,2);
    a{1,1} = NaN;
    a{1,2} = 2;
    a{2,1} = NaN;
    a{2,2} = 'hi';
    

    您可以使用isnan element-wise(在单元格的每个元素上),例如:

    isnan(a{1,1})
    =
        1
    

    或者当单元格的所有元素都是同一类型时,可以先使用cell2mat函数对其进行转换,然后一次性检查所有带有isnan的元素,如:

    a = cell(2,2);
    a{1,1} = NaN;
    a{1,2} = 2;
    a{2,1} = NaN;
    a{2,2} = 3;
    
    c=cell2mat(a)
    
    c =
    
       NaN     2
       NaN     3
    
    isnan(c)
    
    ans =
    
         1     0
         1     0
    

    所以答案取决于您拥有的xls sheet 和数据类型。您可以使用上述选项之一。

    更新

    如果你使用双数组的例子:

    >> D = rand(2,3);
    >> D(2,2) = NaN
    
    D =
    
        0.8147    0.1270    0.6324
        0.9058       NaN    0.0975
    
    >> idx = isnan(D)
    
    idx =
    
         0     0     0
         0     1     0
    
    >> D(idx) = []
    
    D =
    
      Columns 1 through 3
    
        0.8147    0.9058    0.1270
    
      Columns 4 through 5
    
        0.6324    0.0975
    

    当然,它把矩阵的结构分解成一个向量。

    【讨论】:

    • xlsread 返回一个双精度数组(不是元胞数组)>> [D, headers] = xlsread('Workbook2.xlsx', 'Sheet1', 'A2:BE101'); >> class(D) ans = double >> size(D) ans = 100 57 >>
    • 所以只要做D(idx) = []就可以了。
    • D(idx) = [] 重新调整了矩阵的尺寸。 >> [D, headers] = xlsread('Workbook2.xlsx', 'Sheet1', 'A2:BE101'); >> size(D) ans = 100 57 >> class(D) ans = double >> idx = isnan(D); >> 大小(idx)ans = 100 57 >> D(idx) = []; >> 尺寸(D)ans = 1 2557 >>
    • 来自 Mathworks 关于 SOM:“奇怪的是,您训练 SOM 的大约 5% 的输入数据包含 NaN 值。训练 SOM 的算法旨在对数值数据进行操作仅。因此,NaN 值会导致训练过程表现出奇怪的行为。在您的 SOM 的情况下,输出数据只包含 NaN 值。我会考虑从您的输入数据中删除 NaN 值并重新训练 SOM 。”
    • 当然会改变矩阵的结构。因为它不知道如何在没有空值的情况下保留它。
    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2021-05-26
    • 2018-10-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多