Преобразовать матрицу в ячейку и заменить NaN на '-' - PullRequest
1 голос
/ 21 февраля 2020

У меня есть матрица 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 ]

3 голосов
/ 21 февраля 2020

Ваша идея использования mat2cell хороша, может быть, использование просто не понятно !? Вы также можете использовать num2cell, который кажется более простым в использовании. Кроме того, индексирование с логическими значениями также работает с массивами ячеек, которые могут быть более эффективными, чем 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] = -
}

Надеюсь, это поможет!

2 голосов
/ 21 февраля 2020

Вы можете объединить две ваши попытки, обратите внимание, что вы делаете хотите 'UniformOutput' из cellfun, потому что вам нужен логический массив.

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

В качестве альтернативы вы можете просто используйте al oop ...

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 / et c, то вы можете гарантировать код, написанный с этими функциями, будет сложнее поддерживать для себя и других! По крайней мере, l oop является явным и не обязательно медленным в наши дни (хотя, если вы храните данные цифр c в массивах ячеек смешанного типа, я должен предположить, что производительность в любом случае не имеет первостепенного значения).

1 голос
/ 21 февраля 2020

Я думаю, вы можете попробовать num2cell

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

, что дает

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