Ответ 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'
который может быть конкатенирован.