MATLAB - 删除元胞数组中的 NaN 元素。帮助加速功能

MATLAB - Remove NaN elements in cell array. Help to speed up a function

我需要帮助来加速我创建的用于删除元胞数组中的 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];

我想让函数 function 做的是删除元胞数组中的所有 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

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

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

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