Округлять только числовые элементы в массиве ячеек с разными типами данных

У меня есть ячейка с различными типами переменных (double & strings), я хочу округлить числовые элементы в ячейке.round функция может работать только с массивами, а не с ячейками, поэтому я пытаюсь использовать cell2mat - но эту функцию нельзя использовать в случае разных типов элементов в ячейке.

Любая идея, как я могу округлить числовые элементы в этой ячейке? Конечно, я не хочу делать цикл по элементам ячейки.

2 ответа

Решение

Как уже упоминал Адриан, это можно сделать с cellfun:

function testCell = q38476362

  testCell = {'t','h',1.004,'s',[],'i',4.99,[],'a',[],'ce',10.8};
  isnum = cellfun(@(x)~isempty(x) & isnumeric(x),testCell);
  testCell(isnum) = num2cell(round([testCell{isnum}],0));

testCell = 

    't'    'h'    [1]    's'    []    'i'    [5]    []    'a'    []    'ce'    [11]

Если ваш массив ячеек является случайным с точки зрения того, где stringи где doubleс, вы не можете ничего сделать, кроме цикла /cellfun брутфорс. Однако, если есть некоторая периодичность (например, за строкой всегда следуют два double records") вы можете создать индексный вектор, который бы получал значения без необходимости итерации (явной или неявной).

Вы хотите воспользоваться str2double возможность конвертировать нечисловые типы в NaN.

Скажем, у вас есть такая клетка:

 A = {'1.999','3.1415','pie','??'}
 B = round(str2double(A))

 B =

 2     3   NaN   NaN
Другие вопросы по тегам