Matlab:字符串不是真正的字符串?

时间:2013-09-13 05:10:35

标签: string matlab pdf

我有一个将图像打印到文件的脚本。我希望我打印的文件的名称是动态的 - 即我希望输出文件名依赖于某些参数。有点像这样:

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)

当我检查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. 上面的问题是因为我有一个很多(> 5GB)的数据需要转换成图并保存到文件中。最终,我需要在任何PC上打开的单个文档中的所有这些图(如... pdf!)。为了实现这一点,我将所有数据作为单独的页面附加到postscript文件,然后将ps转换为pdf。不幸的是ps不是很节省空间,所以我最终得到了一个巨型 .ps文件。以上是我尝试将一个巨人 .ps拆分成几个较小的,我可以依次转换为pdf(然后组合成一个单独的pdf)。这种方法非常复杂,但我一直无法找到更好的方法。您是否有更好的方法来完成我的任务?

  4. 如果我遗漏了任何可能有帮助的细节,请告诉我。我是Matlab的新手,这是我关于Matlab的第一篇SO帖子!

3 个答案:

答案 0 :(得分:9)

请考虑以下事项:

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

>> class(x)
ans =
cell

我想你打算写:

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

或简单地说:

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

请注意使用大括号而不是括号。

答案 1 :(得分:0)

你的MATLAB路径上是否还有其他名为fname的东西?

尝试

which -all fname

这将告诉您这是否是其他地方使用的名称。

答案 2 :(得分:0)

class(fname)返回char而不是string是正常的:

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

  

S = 'Any Characters'创建一个字符数组或字符串。该字符串实际上是一个包含字符数字代码的向量(代码0到127是ASCII)。 S的长度是字符数。

我认为您的代码无法正常工作的原因。您确定index1吗?您可以在暂停代码时放置断点并检查变量的值。我会把错误发生在一个地方,或者可能是早些时候的某些行。有关调试的更多帮助:here