2016-01-23 30 views
4

我有几个记录存储在矩阵DataMatrix中的数据库。矩阵的每一行都是一条记录,每一列都是记录属性的值。 为了使程序容易理解,因为我定义的变量名称说明什么属性相关联的列DataMatrix每一列,那就是:在Matlab中的函数之间共享“许多”变量在Matlab中有

ColApple = 1; 
ColOrange = 2; 
ColLemon = 3; 
... 

我对50列名。

我的问题是DataMatrix中的值用于不同的功能,我想总是使用列名来处理DataMatrix中的数据。所以,我有不同的功能之间共享的ColAppleColOrangeColLemon值,...

到现在为止我认为两种可能的方法:

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

    [ColApple, ColOrange, ColLemon, ... ] = getColNames

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

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

回答

7

这非常适合container maps。容器映射允许创建字典。例如

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

将创建字典

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

你可以用

>> fruits('Orange') 

ans = 

    2 
+0

在这里,我想我有一个很好的解决方案;)总是有一个内置的人完全按照要求。做得好! – Adriaan

+0

@hbaderts正是我所期待的,谢谢 – MeSS83

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做,因为这是能够存储各种不同的数据,并为每个结构进入一个合理的名称:

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

感谢找到所需的列数,但我不知道我完全理解了答案。使用你的例子'ColumnNames {1,22}'返回'Col 22',所以,给定列号我得到列名。给定两个函数'function1'和'function2',并将变量'ColumnNames'传递给它们,我相信,给定相同的列号,我会得到相同的列名。但是我正在寻找的是相反的:鉴于相同的列名,我想有相同的列号。这样,'DataMatrix(:,Col22)= something'命令可以在'function1'和'function2'的同一列工作。 – MeSS83

+0

也许你认为在通过'ColumnNames'之后,我应该使用类似'for ii = 1:length(ColumnNames)str = [ColumnNames {1,ii}'='int2str(ii)]; eval(str);结束' – MeSS83

+0

@ MeSS83我永远不会认为使用'eval'是一个好主意。查看关于使用动态变量名称的链接文章。 'eval'打破了与MATLAB相关的所有内容,不会在我看来被使用。如果您不在数据中移动列,那么如果您将数据从一个函数传递到另一个函数,则第22列将仍然是第22列,所以我在那里看不到问题。 – Adriaan