将矩阵转换为单元格并将 NaN 替换为“-”

Convert matrix to cell and replace NaN with '-'

我有一个矩阵A

A = [nan nan 1 0 nan]

如何将矩阵 A 转换为元胞,并将 nan 替换为 '-',因此新的 B 元胞数组将如下所示:

B = {'-' '-' 1 0 '-'}

我试过了

A = mat2cell(A);

A = num2str(A);

然后

A(cellfun(@isNaN,A,'uniformoutput',false)) = {'-'};

这不起作用。

我觉得你可以试试num2cell

B = num2cell(A);
B(cellfun(@isnan,B)) = {"_"};

这给出了

>> B
B =
{
  [1,1] = _
  [1,2] = _
  [1,3] =  1
  [1,4] = 0
  [1,5] = _
}

您可以将您的两次尝试配对,请注意您确实想要cellfun中的'UniformOutput',因为您需要一个逻辑数组。

A = num2cell(A);
A(cellfun(@isnan,A)) = {'-'};

或者你可以只使用一个循环...

B = cell( size( A ) );
idx = isnan( A );
for ii = 1:numel(A)
    if idx(ii)
        B{ii} = '-';
    else
        B{ii} = A(ii);
    end
end

这可能看起来很迟钝,但如果您正在为 mat2cell/cellfun/等的正确实现而苦苦挣扎,那么您可以保证使用这些函数编写的代码将更难维护自己和他人!至少循环是明确的,而且现在不一定很慢(尽管如果您将数字数据存储在混合类型的元胞数组中,那么我不得不假设性能无论如何都不是最重要的)。

您使用 mat2cell is good, maybe the usage just isn't clear!? You could also use num2cell, which seems a bit more easier to use. Additionally, indexing with logical values 的想法也适用于元胞数组,这可能比 cellfun 和类似的方法更有效:

A = [nan nan 1 0 nan]

B = num2cell(A);
B(isnan(A)) = {'-'}

输出:

A =
   NaN   NaN     1     0   NaN

B =
{
  [1,1] = -
  [1,2] = -
  [1,3] =  1
  [1,4] = 0
  [1,5] = -
}

希望对您有所帮助!