【问题标题】:xlsread in Matlab returns NaN even there is no data in Excel即使 Excel 中没有数据,Matlab 中的 xlsread 也会返回 NaN
【发布时间】:2017-06-08 05:20:57
【问题描述】:

我使用xlsread 读取 xlsx 文件。我预计rawdata 将返回一个 34x3 单元格数组。

[raw_num raw_txt rawdata]=xlsread('file.xlsx');

raw_numraw_txt 返回正确的值,34x1 元胞数组和 34x2 元胞数组。

但是,当我检查 rawdata 时,它返回 139x6 元胞数组。它不仅包含 excel 文件中的数据,还包含 NaN 元素。对于NaN 元素,excel 文件中没有数据。我只能假设我之前可能会输入一些内容,然后将其删除。但是为什么 matlab 会读呢?

原始数据如下所示:

'a' 'b' 'c' NaN NaN

'd' 'e' 'f' NaN NaN

NaN NaN NaN NaN NaN

使用 xlsread 时如何避免这种情况?

或者我得到这个矩阵后如何去除 NaN?

感谢您的帮助

【问题讨论】:

    标签: matlab nan xlsread


    【解决方案1】:

    如果NaN 元素仅位于矩阵的边缘,如您的示例所示,您可以先删除所有NaN 的行,然后删除所有NaN 的列。

    % test data
    A = {NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN};
    A{1, 1} = 'a';
    A{1, 2} = 'b';
    A{2, 1} = 'c';
    A{2, 2} = 'd';
    
    fh = @(x) all(isnan(x));
    % remove rows with all NaN
    A(all(cellfun(fh, A),2),:) = [];
    % remove columns with all NaN
    A(:,all(cellfun(fh, A),1)) = [];
    

    您必须这样做的原因是因为cellfun 不保留维度,因此您必须单独在每个维度上运行它。或者,您可以编写一个 for 循环。

    【讨论】:

    • all(cellfun(fh, A)) 仅在“第一行”返回 NaN 的逻辑。所以当矩阵 A 中的 NaN 行列不一样时,这段代码就无法正常执行。例如,我将 A 更改为 3x4 单元格: A = {NaN, NaN, NaN, NaN;南,南,南,南;南,南,南,南}; A{1, 1} = 'a'; A{1, 2} = 'b'; A{2, 1} = 'c'; A{2, 2} = 'd';然后 A(all(cellfun(fh, A)),:) = [] 将显示错误
    • 我认为应该是:fh = @(x) all(isnan(x)); a1=cellfun(fh,A); A(a1(:,1),:)=[]; A(:,a1(1,:))=[];
    • @chshiu 您编写的代码仅在非 NaN 元素位于矩阵左上角时才有效,但如果在中间,或者如果有一些行中间的 NaN 等等。虽然这是一种有趣的方法。我现在看看能不能修改它来解决你的问题
    • 我在NaN居中的条件下测试了你的代码和我的代码。两者都成功。
    • 很好,只要它能解决您的问题。试试这个A = {NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN; NaN, NaN, NaN, NaN}; A{2, 2} = 'a'; A{2, 3} = 'b'; A{4, 2} = 'c'; A{4, 3} = 'd';,你会发现问题的。
    【解决方案2】:

    您可以像下面这样删除 NaN:

    k = {'a' 'b' 'c' NaN NaN}
    k(cellfun(@isnan, k)) = [] ;
    

    【讨论】:

    • 就我而言,我被要求将 UniformOutput 设置为 false。但是当我使用“rawdata(cellfun(@isnan, rawdata,'UniformOutput',false)) = [];”时我收到一个错误:没有为类 'cell' 的值定义函数 'subsindex'。
    • 你使用的是什么版本?
    • matlab 是 R2015b
    • 我在 2015a.. 它工作正常...试试这个:k(cellfun(@isnan, k,'un',1)) = []
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2019-12-12
    相关资源
    最近更新 更多