【问题标题】:Using Strcat to create dynamic variable names使用 Strcat 创建动态变量名
【发布时间】:2012-01-31 15:20:52
【问题描述】:

我有一个对存储在单独文件夹中的一组数据重复的过程。每次处理某个文件夹数据时,我都需要新的变量名称,因为在初始处理完成后我需要将结果分开以进行更多处理。 例如,在重复函数的每个新块的开头,我声明数组集

Set_1 = zeros(dim, number);

vectors_1 = zeros(dim, number);

我需要的下一组数据:

`Set_2 = .........`

等等。会有很多这样的集合,所以我需要一种方法来自动创建这些变量,并在函数中使用新变量名称,同时在所有函数完成后保持它们是分开的。

我第一次尝试使用strcat('Set_1',int2str(number)) = zeros(dim, number) 但这不起作用,我相信因为这意味着我会尝试将数组设置为字符串。我确信必须有一种方法可以创建一个函数并动态创建变量,但它似乎超出了我的范围,所以它可能很明显,所以如果有人能告诉我一种很棒的方法。

【问题讨论】:

    标签: matlab eval


    【解决方案1】:

    我不会这样做。这是一个坏习惯,最好使用单元格数组或结构来保留多个集合。每个字段的开销很小(按大小计算),但以后维护起来会容易得多。

    如果您真的非常想这样做,请在您编写的字符串上使用eval

    【讨论】:

    • 您能否详细解释一下如何将元胞数组或结构数据类型用于动态变量名?我用它来让用户设置变量的名称: eval([var2n '=' num2str(var2v)]);其中 var2n 是用户输入的字符串
    • 对动态字段名称使用带有“点括号”表示法的结构。 s = struct; n = 12; var2v = '123.456'; var2n = sprintf('foo_%d', n); s.(var2n) = num2str(var2v);
    • 或使用元胞数组:Sets=cell(nSets,1);vectors=cell(nSets,1); for k=1:nSets, Sets{k}=zeros(dim,number); vectors{k}=zeros(dim,number); end
    • 元胞数组可以包含您希望它包含的任何数据。所以不同尺寸的矩阵是没有问题的。
    • 是的,当然,这就是我首先要说的。像这样就完美了:m=cell(3,1); m{1}='foo';m{2}=speye(100);m{3}=struct('foo','bar','qsd',1);
    【解决方案2】:

    MATLAB 函数 genvarname 可以满足您的需求。在您的情况下,它看起来像:

    eval(genvarname('Set_', who)) = zeros(dim, number);
    

    但是,我会遵循之前答案的建议,并使用单元格或结构来存储结果。

    【讨论】:

      【解决方案3】:

      这种模式被认为是有害的,因为它需要eval 函数。有关避免它的技术,请参阅以下其中一项:

      如果你坚持使用eval,那么使用类似:

      eval(sprintf('Set_1%d = zeros(dim, number);', number))
      

      【讨论】:

        猜你喜欢
        • 2021-10-26
        • 2011-10-27
        • 2011-02-23
        • 2021-12-31
        • 2014-09-02
        • 2015-02-27
        • 1970-01-01
        相关资源
        最近更新 更多