【问题标题】:Can i format output of matlab command such that i can use it to declare a new variable?我可以格式化 matlab 命令的输出,以便我可以使用它来声明一个新变量吗?
【发布时间】:2014-11-08 23:46:57
【问题描述】:

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

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

ans = 
'folder1'
'folder2'
'file1'

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

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

但这意味着在“ans =”下复制粘贴输出,然后手动添加逗号和大括号。在我的情况下,单元阵列非常大,所以这是不可取的。更让人觉得笨拙,可能有更简单的方法。有什么方法可以让 matlab 以我不必这样做的方式打印输出?

对于矩阵而不是元胞数组来说,知道完全相同的事情会很好!

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

【问题讨论】:

    标签: arrays performance matlab


    【解决方案1】:

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

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

    矩阵

    对于一维或二维矩阵mat2str 提供此功能

    mat2str(eye(2))
    ans =
    
    [1 0;0 1]
    

    细胞

    但据我所知,单元格没有这样的内置函数。
    对于字符串的一维元胞数组,以下将以可复制格式给出输出:

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

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

    【讨论】:

    • 您没有处理这部分“然后手动添加逗号和大括号。”
    • 您是否尝试运行代码 + 复制粘贴输出?添加大括号并使用空格代替逗号(因为 Matlab 会将它们视为像逗号一样的元素分隔符,但优点是不必绕过尾随分隔符,因为 Matlab 将忽略空格)
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 将它们存储为文本文件是个好主意,但在这种情况下,我真的在寻找类似 RTL 的东西。不过谢谢!
    • @Joachim 存储在变量cmd 中的字符串正是您所要求的。在脚本 2 中发布此字符串或使用 eval 对其进行评估。
    【解决方案3】:

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

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

    找到结果后,只需这样做:

    save names
    

    稍后您可以使用

    加载此变量
    load names
    

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

    【讨论】:

    • 请注意,如果您真的“一起”使用函数,您可能甚至不需要使用 save,而是可以将变量用作一个函数的输出并输入到另一个函数。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多