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'
输入确保结果也是元胞数组。
我需要帮助来加速我创建的用于删除元胞数组中的 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'
输入确保结果也是元胞数组。