分享"很多" Matlab中函数之间的变量

时间:2016-01-23 09:07:48

标签: matlab parameter-passing

在Matlab中的

我有几个存储在矩阵DataMatrix中的数据库记录。矩阵的每一行都是一条记录,每列都是记录属性的值。 为了使程序易于理解ColApple = 1; ColOrange = 2; ColLemon = 3; ... 的每一列,我定义了一个变量名称,用于解释与列关联的属性,即:

50

我有大约DataMatrix列要命名。

我的问题是DataMatrix中的值用于不同的函数中,我希望始终使用列名来处理ColApple中的数据。所以我必须在不同的函数之间共享ColOrangeColLemon...[ColApple, ColOrange, ColLemon, ... ] = getColNames

的值

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

  1. 使列名称为全局
  2. 定义一个函数,返回列名的值,即:

    50

  3. 我会避免使用全局解决方案,因为我觉得它很危险,也因为我希望列名称在可能的情况下保持不变。 第二种方法更好,但由于我有50列,我不知道让函数返回void method var number = 100 number = number + 200 number = number / 20 print("result" . number) 不同的值是否是一个好主意(在我看来也很难维护)。 / p>

    任何人都有更强大或可维护的方法来解决这个问题?我相信我不是第一个处理这个问题的人,但我无法找到解决办法。

2 个答案:

答案 0 :(得分:7)

这对container maps来说非常完美。容器映射允许创建字典。例如

fruits = containers.Map({'Apple', 'Orange', 'Lemon'}, [1, 2, 3])

将创建字典

'Apple'   ->   1
'Orange'  ->   2
'Lemon'   ->   3

您可以使用

找到所需的列号
>> fruits('Orange')

ans =

     2

答案 1 :(得分:2)

不要使用全局变量,因为它们容易出错。创建50个变量名也不是非常防错(参见:dynamic variable naming)。

在这种情况下,我会使用简单的cell array。您可以从数据矩阵的第一行读取名称(如果它们是在那里写的),或者如果您现在正在执行此操作,请手写。

ColumnNames = {'Col1', 'Col2', 'Col3', (...) , 'Col 50'}

这将为您提供包含列名的1 x 50单元格数组。只需输入正确的列号即可找到名称,即第22列为ColumnNames{1,22}。您现在可以将变量ColumnNames作为单个变量传递给其他函数。如果不使用动态变量命名,则获取相应的列名称,例如您的colApple,可以使用strcmp

ColIdx = find(strcmp(ColumnNames,'colApple'));

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

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

result.data = [m x 9 double]
result.grid.z = ~[5000 x 5500 double]
result.filename = 'filename.asc'
...