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

时间:2020-02-21 11:12:57

标签: matlab matrix nan cell-array

我有一个矩阵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)) = {'-'};

这不起作用。

3 个答案:

答案 0 :(得分:3)

您使用mat2cell的想法很好,也许用法不清楚!您还可以使用num2cell,它似乎更易于使用。此外,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] = -
}

希望有帮助!

答案 1 :(得分:2)

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

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 / etc的正确实现而苦苦挣扎,那么可以保证用这些函数编写的代码将很难为您自己和其他!至少循环是显式的,并且这些天并不一定会变慢(尽管如果您将数字数据存储在混合类型的单元格数组中,那么我必须假设性能绝对不是最重要的。)

答案 2 :(得分:1)

我认为您可以尝试num2cell

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

给出

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