“分享”;“许多”;Matlab中函数间的变量
在Matlab中,我在矩阵“分享”;“许多”;Matlab中函数间的变量,matlab,parameter-passing,Matlab,Parameter Passing,在Matlab中,我在矩阵DataMatrix中存储了数据库的多条记录。矩阵的每一行都是一条记录,每一列都是该记录属性的值。 为了使程序易于理解DataMatrix的每一列,我定义了一个变量名,解释与该列关联的属性,即: ColApple = 1; ColOrange = 2; ColLemon = 3; ... 我有大约50列要命名 我的问题是,DataMatrix中的值在不同的函数中使用,我希望总是使用列名来处理DataMatrix中的数据。因此,我必须在不同的函数之间共享ColApple
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
,以及所有相关的陷阱和故障。在这里,我想我有一个很好的解决方案;)总是有人有一个内置的,它做的正是所要求的。干得好@这正是我想要的,谢谢