2012-05-21 4 views
18

Я пытаюсь перебрать список строк в MATLAB. Проблема в том, что внутри цикла 'for' мой итератор считается «ячейкой», а не строкой.Итерация над списком строк в MATLAB

for str = {'aaa','bbb'} 
    fprintf('%s\n',str); 
end 

??? Error using ==> fprintf 
Function is not defined for 'cell' inputs. 

Каков правильный \ элегантный способ исправить это?

+2

Интересно, если это концептуальная ошибка в дизайне от Matlab. Почему это построено так? – Memming

+0

@Memming Nope. Только тот, кто не знает, как использовать семейство функций '* printf' – KitsuneYMG

ответ

22

Вы должны вызвать содержимое ячейки через str{1} следующим образом, чтобы сделать это правильно:

for str = {'aaa','bbb'} 
    fprintf('%s\n',str{1}); 
end 

Вот more sophisticated example на печать содержимого ячейки массивов.

+2

' char (str) 'тоже работает, и не прерывается, если цикл изменяется так, что str входит как массив символов, а не cell – tmpearce

+1

Это действительно беспокоит меня каждый раз, когда я работаю с массивом ячеек строк. Разве нет более элегантного способа перебора массива ячеек для непосредственного получения содержимого ячеек без вызова str {1}? - edit - nevermind, только что нашел это: http://stackoverflow.com/questions/16587564/can-the-s1-annoyance-when-iterating-over-a-cell-array-be-avoided – rich

6
str={'aaa','bbb'}; 
fprintf('%s\n',str{:}); 

Не нужно для for.

EDIT: Смотрите также: cellfun

+1

@petrichor На данный момент я кодирую matlab для жизни. Я был глубоко погружен в «cellfun» и повторяющиеся вызовы вроде этого. Я также изучил одно истинное правило о Matlab: никогда не используйте цикл. Даже божественный беспорядок 'repmat',' permute' и 'reshape' быстрее, чем итерация. – KitsuneYMG

Смежные вопросы