【问题标题】:MATLAB - Remove NaN elements in cell array. Help to speed up a functionMATLAB - 删除元胞数组中的 NaN 元素。帮助加速功能
【发布时间】:2016-09-15 02:36:14
【问题描述】:

我需要帮助来加快我创建的用于删除元胞数组中的 NaN 元素的函数。

用一个例子更好地解释我的功能。假设我们有一个元胞数组,我有一个indx{ii} 形式的元胞数组,其中每个ii 是一个大小为1xNii 的数组(这意味着数组具有不同的大小),上面有NaN 元素。

datawithNaN{1}=[1,4,8,6];
datawithNaN{2}=[4,6,2];
datawithNaN{3}=[9,8,NaN];
datawithNaN{4}=[3,NaN,NaN];
datawithNaN{5}=[NaN,NaN,NaN,NaN];

我希望函数函数做的是删除元胞数组中的所有 NaN 元素。所以这个例子的答案应该是:

datawithoutNaN{1}=[1,4,8,6];
datawithoutNaN{2}=[4,6,2];
datawithoutNaN{3}=[9,8];
datawithoutNaN{4}=[3];
datawithoutNaN{5}=[];

到目前为止,我已经编写了一个函数,它可以给我想要的结果,但是特别是在处理大单元阵列或单元阵列内的大阵列时需要太多时间。 我的功能是:

function result = rmNaN(datawithNaN)

[row_cell, col_cell] = size(datawithNaN);
result = cell(row_cell, col_cell);
for i=1:row_cell
    for j=1:col_cell
        [row,col]=size(datawithNaN{i,j});
        if col>row
            datawithNaN{i,j}=datawithNaN{i,j}';
            [row,~]=size(datawithNaN{i,j});
        end
        for k=1:row
            if ~isnan(datawithNaN{i,j}(k))
                result{i,j}(k) = datawithNaN{i,j}(k);
            else
                continue
            end
        end
    end
end

【问题讨论】:

    标签: arrays matlab function nan cell-array


    【解决方案1】:

    您可以使用cellfun 轻松完成此操作。

    datawithoutNaN = cellfun(@(x)x(~isnan(x)), datawithNaN, 'uniform', 0);
    

    这会遍历元胞数组的每个元素,使用isnan 来确定数组中的哪些元素是NaN,并生成一个大小与x 相同的逻辑数组true NaNfalse 否则。然后它否定它并将其用作逻辑索引以仅获取非Nan 值并返回它们。 'uniform' 输入确保结果也是一个元胞数组。

    【讨论】:

    • 我试过了,效果很好!而且比我写的更简单!谢谢:)。
    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多