我可以格式化matlab命令的输出,以便我可以使用它来声明一个新变量吗?

时间:2014-09-15 12:33:09

标签: arrays performance matlab

最好用一个更简单的例子来解释。假设MATLAB中的一些脚本给了我一个字符串的单元格数组:

temp = dir;
names = {temp.name}'

ans = 
'folder1'
'folder2'
'file1'

我想在另一个脚本中使用此输出,在另一个matlab会话中。理想情况下,在第二个脚本中我会写

names = {'folder1', 'folder2', 'file1'}

但这意味着在" ans ="下正确复制输出。然后手动添加逗号和大括号。在我的情况下,单元阵列非常大,所以这是不可取的。更令它感到笨拙,可能会有一个更简单的方法。有没有办法让matlab以这样的方式打印输出?我不必这样做?

对于矩阵而不是单元阵列来说,完全相同的事情会很好!!

我知道将变量保存在.mat文件中并加载它,但我想知道上面是否也可以(在我的情况下它会更干净)。

3 个答案:

答案 0 :(得分:2)

就个人而言,我建议使用更清洁的方式来处理这个问题(例如垫文件) 但有时候,有时花在设置这些上的时间对于不太可能重复的简单任务来说是不值得的......

对于矩阵,有一个内置函数来执行此操作,但对于单元格,我们需要生成具有所需格式的sting ...

矩阵

对于1d或2d矩阵mat2str提供此功能

mat2str(eye(2))
ans =

[1 0;0 1]

细胞

但据我所知,细胞没有内置功能 对于1d单元格字符串数组,以下将以可复制格式提供输出:

['{',sprintf('''%s'' ',names{:}),'}']
ans =

{'folder1' 'folder2' 'file1' }

注意:单元格中的stings不能包含'字符

答案 1 :(得分:1)

如果我理解正确,您将从一个脚本获取names输出,并希望在另一个脚本中使用它。由于您无法将其作为函数参数传递,因此您当前正在将其复制。人们可以通过eval和copy& paste around来做到这一点:

names = {'folder1'
'folder2'
'file1'};

% create the command
n = length(names);
cmd = sprintf(['names = {',repmat('''%s'', ', 1, n-1) ,'''%s''}'], names{:}); % '%s, %s, ...., %s' format
% cmd contains the string: names_new = {'folder1', 'folder2', 'file1'}

% eval the cmd in script 2
eval(cmd) % evals the command names = {'folder1', 'folder2', 'file1'}

但这通常是非常糟糕的做法,因为如果某些地方出现问题,调试变得非常困难。它也会让你复制和粘贴东西,我觉得这很不舒服。如何将它们存储在txt文件中并在第二个脚本中加载它们?它可以自动完成任务。

names = {'folder1'
'folder2'
'file1'};

% write output to file
fid = fopen('mynames.txt', 'w'); % open file to write something
fprintf(fid, [repmat('%s, ',1, n-1), '%s'], names{:});
fclose(fid);

% here comes script 2
fid = fopen('mynames.txt', 'r'); % open file to read something
names_loaded = textscan(fid, '%s');
names_loaded = names_loaded{:};
fclose(fid)

答案 2 :(得分:0)

我认为这里的关键是你在一个地方有一个变量,并希望在不同的情况下使用它。

在那种情况下你不想复制matlab生成的输出,你只想保存值本身。

找到结果后,只需执行以下操作:

save names

稍后您可以使用

加载此变量
load names

检查doc savedoc names以获取更多示例。例如,您可能希望将所有相关变量保存在具有更通用名称的文件中。