matlab - 在 Matlab 中动态分配变量

标签 matlab dynamic-variables

我继承了以下函数作为大型代码库的一部分:

function = save_function(fpath, a,b,c)
    save(fpath, 'a', 'b', 'c')
end

此函数在一个脚本结束时、在执行另一脚本之前调用。这样,变量名称就可以正确保存(我知道这是糟糕的设计 - 我没有编写这段代码)。

现在,我正在对代码库进行更改,并意识到我需要在 fpath 中存储更多变量。我面临两个选择:

  1. 编辑save_function以接受更多输入。这会破坏代码库中也使用此函数的任何其他代码
  2. 编写一个 save_function2(a, b, c, d, e, ...),我将在更改的代码中调用它。这看起来也是糟糕的设计。

我理想中想做的是允许 save_function 一次接受任意数量的参数,并通过传入的变量名称保存它们。

经过一些谷歌搜索,我发现了 evaleval_in,它们将字符串计算为 matlab 代码。但是,使用它有两个问题:

  1. 使用 eval 速度非常慢并且非常危险
  2. 我并不总是事先知道变量的类型,因此无法创建优雅的通用 to_string 函数

为了应对灵活数量的变量,我决定使用varargininputname,如下所示:

function = save_function(fpath, varargin)
    names = {}
    for i=1:size(varargin,1)
        names{i} = inputname(i+1);  % have to offset by 1 to account for fpath
    end
    save(fpath, names{:});
end

不幸的是,由于输入变量保存在 varargin 中,因此它们在堆栈中并不以其变量名的形式存在,因此 save 行失败

如何在堆栈上动态创建这些变量及其变量名称?

最佳答案

您可以使用结构来动态定义保存的变量名称。
此选项记录在here中.

 function save_function( fpath, varargin )     
 for ii = 1:numel( varargin )
     st.( inputname(ii+1) ) = varargin{ii};
 end
 save( fpath, '-struct', 'st' );

根据经验,structure with dynamic field names当涉及到动态变量名称时,通常比 evalassignin 更好。

附注,
最好not to use i as variable name in Matlab .

关于matlab - 在 Matlab 中动态分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502069/

相关文章:

javascript - 如何在匿名函数/闭包中动态访问变量?

c# - 具有动态参数的整数类型预期开关的值

matlab - 在 Matlab 中使用 hgtransform 命令绘制 3D 动画图

java - 在 Matlab 调用的 java 方法中使用可变参数

arrays - 为每个循环导入多个声音, ActionScript 3

batch-file - 批处理 - 评估名称中带有参数的动态变量

javascript - 你能在不使用 eval() 的情况下使用变量名来引用对象吗

matlab - MATLAB 中冒号运算的组合

matlab - 尝试在 MATLAB 中使用 parfor(并行 for 循环)时出错

java - 如何将 Matlab GUI 转换为 Java?