“分享”;“许多”;Matlab中函数间的变量

“分享”;“许多”;Matlab中函数间的变量,matlab,parameter-passing,Matlab,Parameter Passing,在Matlab中,我在矩阵DataMatrix中存储了数据库的多条记录。矩阵的每一行都是一条记录,每一列都是该记录属性的值。 为了使程序易于理解DataMatrix的每一列,我定义了一个变量名,解释与该列关联的属性,即: ColApple = 1; ColOrange = 2; ColLemon = 3; ... 我有大约50列要命名 我的问题是,DataMatrix中的值在不同的函数中使用,我希望总是使用列名来处理DataMatrix中的数据。因此,我必须在不同的函数之间共享ColApple

在Matlab中,我在矩阵
DataMatrix
中存储了数据库的多条记录。矩阵的每一行都是一条记录,每一列都是该记录属性的值。 为了使程序易于理解
DataMatrix
的每一列,我定义了一个变量名,解释与该列关联的属性,即:

ColApple = 1;
ColOrange = 2;
ColLemon = 3;
...
我有大约50列要命名

我的问题是,
DataMatrix
中的值在不同的函数中使用,我希望总是使用列名来处理
DataMatrix
中的数据。因此,我必须在不同的函数之间共享
ColApple
ColOrange
ColLemon

到目前为止,我想到了两种可能的方法:

  • 使列名为全局

  • 定义一个返回列名称值的函数,即:

    ColApple = 1;
    ColOrange = 2;
    ColLemon = 3;
    ...
    
    [ColApple,ColOrange,ColLemon,…]=getColNames

  • 我会避免使用全局解决方案,因为我认为这很危险,而且如果可能的话,我希望列名称保持不变。 第二种方法更好,但由于我有
    50
    列,我不知道让函数返回
    50
    不同的值是否是个好主意(我认为这也很难维护)


    有谁有更健壮或可维护的方法来解决此问题?我确信我不是第一个处理这个问题的人,但我无法找到解决方案。

    不要使用全局变量,因为它们容易出错。创建50个变量名也不是很容易出错(请参阅:)

    在这种情况下,我会选择一个简单的例子。您可以从数据矩阵的第一行读取名称(如果它们写在那里),也可以手动写入(如果您现在正在这样做)

    ColumnNames = {'Col1', 'Col2', 'Col3', (...) , 'Col 50'}
    
    这将为您提供一个包含列名的
    1 x 50
    单元格数组。只需输入正确的列号即可找到名称,即第22列为
    ColumnNames{1,22}
    。现在,您可以将变量
    ColumnNames
    作为单个变量传递给其他函数。如果您不使用动态变量命名,但您的
    colApple
    ,为了获得相应的列名,您可以使用

    这样,
    strcmp
    检查哪个单元格包含字符串
    'colApple'
    ,而
    find
    返回请求单元格的索引号

    我在自己的代码中传递了很多变量,这是在a中实现的,因为它能够存储各种不同的数据,并且每个结构条目都有一个合理的名称:

    result.data = [m x 9 double]
    result.grid.z = ~[5000 x 5500 double]
    result.filename = 'filename.asc'
    ...
    
    这是完美的。容器映射允许创建字典。比如说

    fruits = containers.Map({'Apple', 'Orange', 'Lemon'}, [1, 2, 3])
    
    将创建字典

    'Apple'   ->   1
    'Orange'  ->   2
    'Lemon'   ->   3
    
    您可以使用找到所需的列号

    >> fruits('Orange')
    
    ans =
    
         2
    

    谢谢,但我不确定我是否完全理解答案。使用您的示例
    ColumnNames{1,22}
    返回
    col22
    因此,给定列号,我将获得列名。给定两个函数
    function1
    function2
    ,我将变量
    ColumnNames
    传递给它们,我确信,给定相同的列号,我会得到相同的列名。但我所寻找的恰恰相反:给定相同的列名,我希望拥有相同的列号。这样,命令
    DataMatrix(:,Col22)=something
    将在
    function1
    function2
    中的同一列上工作,您可能认为在传递
    ColumnNames
    之后,我应该使用类似于
    for ii=1:length(ColumnNames)str=[ColumnNames{1,ii}='int2str的东西创建变量(ii)];评估(str);end
    @MeSS83我从来都不认为使用
    eval
    是个好主意。请参阅关于使用动态变量名的链接帖子。
    eval
    打破了与MATLAB相关的一切,在我看来是不可使用的。如果您不在数据中移动列,那么如果您将数据从一个函数传递到另一个函数,则第22列将被删除仍然是第22列,所以我看不出有什么问题。你是完全正确的。在我的例子中,第22列始终是第22列,但在我的代码中,我没有写
    DataMatrix(:,22)=一些东西,而是我写了
    DataMatrix(:,ColLemon)=某物
    。我之所以这样做,是因为我认为它更具可读性,而且可能在将来,
    ColLemon
    的值会发生变化。因此,我会确保在我的程序的每个函数中,
    ColLemon
    都具有相同的值。我只是不知道如何使用您的解决方案,传递
    列名
    ,以实现this@MeSS83这是正确的。我不知道容器映射,所以我侵入了那里。我强烈建议您阅读我关于动态变量命名的链接答案,以防止您使用
    eval
    ,以及所有相关的陷阱和故障。在这里,我想我有一个很好的解决方案;)总是有人有一个内置的,它做的正是所要求的。干得好@这正是我想要的,谢谢