Подтвердить что ты не робот

Как преобразовать ячейку в строку в matlab

Предположим, что у меня есть ячейка

v =    'v'    [576.5818]    [3.0286]    [576.9270]

       'v'    [576.5953]    [3.1180]    [576.8716]

       'f'    [      56]    [    58]    [      52]

       'f'    [      56]    [    58]    [      52]

и я хочу преобразовать его в массив ячеек, используя строку формата для каждого элемента: ' %.5f'

Как я могу это сделать? Я пробовал следующий подход, но получаю сообщение об ошибке:

f1 = @(x) sprintf('   %.5f',x);
cellfun(f1, num2cell(v),'UniformOutput', false) 

Я получаю сообщение об ошибке как???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

Может ли кто-нибудь помочь мне заранее заблаговременно

4b9b3361

Ответ 1

String - массив ячеек

Ну, не совсем. Это матрица, но продолжайте читать.

Я думаю, что массив ячеек является самым мистическим типом данных в MATLAB. Итак, пусть demystify немного: -)

Предположим

fruits = {...
    'banana',...
    'apple',...
    'orange'...
}

Прежде всего, для небольших массивов не требуется целочисленное индексирование. Гораздо лучше использовать foreach -подобные конструкции. Действительно,

for index = 1:numel(fruits)
    fruits{index}
end

эквивалентно

for fruit = fruits
    fruit
end

верно?

Ну, не совсем. Первый цикл создает строки, а второй - ячейки. Вы можете проверить его с помощью

for index = 1:numel(fruits)
    [isstr(fruits{index}) iscell(fruits{index})]
end

for fruit = fruits
    [isstr(fruit) iscell(fruit)]
end

то есть [1 0] и [0 1].

Если вы заметили разницу, то вы должны знать, что делать со следующим примером (в этом случае действительно относится к вашему вопросу (!). Я обещаю!). Предположим, вы пытаетесь выполнить горизонтальное конкатенацию в цикле:

for fruit = fruits
    [fruit 'is a fruit']
end

Вы получите

ans = 

    'banana'    'is a fruit'

и т.д. Зачем? По-видимому, этот код пытается связать вложенный массив ячеек с строкой (массив ячеек, содержащий матрицу символов, которые составляют строку типа "банан" ). Итак, правильный ответ

Использовать {:}

for fruit = fruits
    [fruit{:} 'is a fruit']
end

Волшебно это уже дает ожидаемый "банан - это плод", "яблоко - это плод" и т.д.

Советы

Несколько советов:

  • Цикл без индексирования отлично работает с структурами, как в for fruit = [fieldnames][1](fruits)'
  • Вышеупомянутое верно для open source октавы
  • банан - это не просто плод, таксономически это также трава;-) так же, как "банан" в MATLAB - это как строка, так и матрица, т.е. assert (isstr ('banana') & ismat ('banana ')), но assert (iscell (' banana ')) терпит неудачу.
  • {:} эквивалентен cell2mat

PS

решение вашего вопроса может выглядеть так:

Учитывая

vcell = {...
    'v'    576.5818    3.0286  576.9270;
    'v'    576.5818    3.0286  576.9270    
}

скрытые индексные только числовые типы для строк

 vcell(cellfun(@isnumeric, vcell)) =  cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false)

Выше выходов кода

vcell =

'v'    '576.58180'    '3.02860'    '576.92700'
'v'    '576.58180'    '3.02860'    '576.92700'

который может быть конкатенирован.

Ответ 2

Предположим, что мы имеем ячейку следующим образом:

my_cell = {'Hello World'}  
class(my_cell)
ans = 
cell

Мы можем получить строку из нее просто с помощью оператора {:} на нем непосредственно.

   class(my_cell{:})
    ans =
    char

Обратите внимание, что мы можем использовать выражение mycell{:} везде, где мы будем использовать обычную строку.

Ответ 4

Посмотрев файл strjoin.m, я нашел это:

string = [x{:}];