2013-09-13 4 views
2

У меня есть сценарий, который печатает изображения в файл. Я хочу, чтобы имя файла, который я печатаю, был динамическим, то есть я хочу, чтобы имя выходного файла зависело от некоторых параметров. Вроде как это:Matlab: строки на самом деле не строки?

outputFileNames = {'1.0' '1.25' '1.75'}; 

%....some code to determine which outputFileName I should use 

f=figure('visible','off'); 

%.....code to populate figure ..... 

fname = strcat('prefix', outputFileNames(index),'suffix'); 
print(f,'-dpsc2', '-append',fname) 

Я получаю эту ошибку:

Error using LocalCheckHandles (line 81) 
Handle input argument contains non-handle value(s). 

Error in print>LocalCreatePrintJob (line 366) 
handles = checkArgsForHandleToPrint(0, varargin{:}); 

Error in print (line 160) 
[pj, inputargs] = LocalCreatePrintJob(varargin{:}); 

Error in GenerateFieldPlots (line 57) 
print(f,'-dpsc2', '-append',fname) 

Когда я проверяю значение имя_файла я получаю prefix1.0suffix (по желанию), и когда я проверяю значение из index я получаю 1 , Если я заменю fname = strcat('prefix', outputFileNames(index),'suffix'); на fname = strcat('prefix', '1.0','suffix'); Программа отлично работает и выводит на ожидаемое имя файла.

Последняя попытка сделать смысл этого:

fname = strcat('prefix', outputFileNames(index),'suffix'); 
class(fname) 

дает char и

fname = strcat('prefix', '1.0','suffix'); 
class(fname) 

также дает char.

Мои вопросы:

  1. Почему это происходит? Является ли мой массив строк не массив строк?

  2. Как исправить это? IE, как сделать динамическое имя выходного файла?

  3. Выше проблемы возникают из-за того, что у меня есть лот (> 5 ГБ) данных, которые мне нужно преобразовать в графики и сохранить в файлах. В конечном итоге мне нужны все эти графики в одном документе, который можно открыть на любом ПК (например, ... pdf!). Для этого я добавляю все свои данные в виде отдельных страниц в файл postscript, а затем конвертирую ps в pdf. К сожалению, ps не очень эффективны в пространстве, поэтому я заканчиваю гигантский файл .ps. Выше моя попытка разбить один гигантский .ps на несколько более мелких, которые я могу преобразовать в pdf в свою очередь (а затем объединить в один pdf). Такой подход очень запутан, но я не смог найти лучшего способа. Есть ли у вас предложение для лучшего способа выполнить мою задачу?

Пожалуйста, дайте мне знать, если у меня остались какие-либо детали, которые могут быть полезны. Я новичок в Matlab, и это мой первый пост SO относительно Matlab!

+0

Просто подумал: может ли это быть проблемой безопасности? Является ли изменение имени выходного файла в коде no-no? – alexvas

+0

Вы уверены, что сообщение об ошибке связано с вашим 'fname'. Для меня это скорее похоже на что-то не так с вашей фигурной ручкой. Попробуйте заменить 'fname' на фиксированное имя, скажем,' 'foo.ps" и проверить, будет ли файл напечатан ... – sebastian

ответ

9

Рассмотрим следующий пример:

>> x = strcat('aaa',{'bbb'},'ccc') 
x = 
    'aaabbbccc' 

>> class(x) 
ans = 
cell 

Я думаю, что вы имели в виду, чтобы написать:

fname = strcat('prefix', outputFileNames{index}, 'suffix'); 

или просто:

fname = ['prefix', outputFileNames{index}, 'suffix']; 

Обратите внимание на использование скобок вместо скобок.

+0

Обратите внимание, что 'strcat' может быть полезна для построения массива ячеек строк:' strcat ('stack', {'over', 'under'}, 'flow') '. В противном случае я предпочитаю использовать простую конкатенацию, если строение регулярных строк – Amro

+0

Я даже не осознавал, что существует различие между фигурными скобками и круглыми скобками. Я предположил, что 'outputFileNames' является эквивалентом Matlab массива, а один - скобками для доступа к элементам массива. Не могли бы вы направить меня к источнику, который обсуждает структуры данных Matlab и различает между '[' и '{'? – alexvas

+1

@alexvas: Ячейки массивов эквивалентны массивам для гетерогенных типов. Это связано с тем, что числовые массивы могут хранить только элементы одного типа. [Эта страница] (http://www.mathworks.com/help/matlab/matlab_prog/access-data-in-a-cell-array.html) объясняет, как обращаться к данным в массивах ячеек. Также здесь [главная страница] (http://www.mathworks.com/help/matlab/cell-arrays.html) для массивов ячеек, содержащих ссылки на все связанные темы. – Amro

0

Возможно ли, что у вас есть что-то еще с именем fname на вашем пути MATLAB?

Попробуйте

which -all fname

Это скажет вам, если это имя используется в другом месте.

+0

Определенно нет. Вышеприведенные фрагменты кода показывают каждое вхождение текста «fname» в скрипте. Кроме того, 'which -all fname' просто возвращает' fname - переменная'. – alexvas

0

Это нормально, что class(fname) возвращается char и не string:

http://www.mathworks.nl/help/matlab/ref/strings.html:

S = 'Any Characters' creates a character array, or string. The string is actually a vector that contains the numeric codes for the characters (codes 0 to 127 are ASCII). The length of S is the number of characters.

Я не вижу никаких причин, почему ваш код не будет работать. Вы уверены, что index является 1? Вы можете поместить контрольные точки и проверить значение переменных при приостановке кода. Я бы поставил ту, где произошла ошибка, или, может быть, некоторые строки раньше. Дополнительная справка по отладке: here.

+0

Я понимаю, что мне следовало ожидать 'char', а не' string', но цель для меня, включая эти выходы, заключалась в том, чтобы показать, что в обоих случаях 'fname' был' char', поэтому ошибка не может быть вызвана некоторые исключения с переменным типом. – alexvas

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