【问题标题】:Variable replacement in tables with two loops具有两个循环的表中的变量替换
【发布时间】:2014-05-09 23:07:06
【问题描述】:

我希望在循环中更改变量名称。名称写在某个元胞数组中,如下所示:

ML.species1{1:end,end+1}=0;
i=1:height(ML.species1);
        ML.species1{i,end}=(ML.species1.someindex(i)*3+(ML.species1.someotherindex(i)
end

我不能只调用变量的名称然后说ML.(ML.speciesname{1,1}){i,end}=...为什么不呢?

如果这可行,我想围绕基本计算进行第二次循环,只需将我的索引j 移动到列名 2、3 来一一交换这里的变量 ML.speciesname{1,j} ... 如何那行吗?

【问题讨论】:

  • 试图理解 - 你想用不同的名字来调用一个变量吗?这个名字是怎么得来的?从某个地方的字符串?你想在什么范围内这样做?调用具有不同名称的局部变量的函数是否足够?抱歉 - 我认为你需要更具体地说明你正在尝试做什么 - 以及为什么。
  • 非常感谢您提出这个问题。是的,我想调用一个看起来像 ML.species1=... 而不是 ML.species2=... 的变量,但我想用一些写在字符串中的名称来引用自己。然后我希望用这个不同的变量计算东西,并将结果存储在第一个变量计算的第一个计算之外的地方。然后我希望跳转到字符串中的下一个变量。

标签: matlab loops indexing


【解决方案1】:

您可能会发现eval 函数对于使用字符串定义变量名称和值很有用。例如,如果您想在strVarName(字符串)中指定一个变量的名称,并在dValue(双精度)中为其指定一个值,您可以这样写:

eval([strVarName ' = ' num2str(dValue) ';']);

Documentationeval

【讨论】:

  • 我不完全确定 OP 的目标是什么;我玩弄了使用 eval 的想法,但由于他似乎在追求结构的元素,我不确定这是否可行。但对于这种一般类型的问题,它绝对是一个有用的功能。我赞成,因为您包含了文档的链接。
  • 我实际上更喜欢您的回答,因为我不知道 getfield 并且一直在使用 eval 进行大量基于名称的解析。这肯定会派上用场。
  • 感谢您的评估,但我认为我应该能够使用更多这个 getfield。我找到了有关从变量生成字段名称的更多信息,但我认为我没有从树上看到森林mathworks.de/de/help/matlab/matlab_prog/…
【解决方案2】:

仍然不能 100% 确定您要做什么 - 但我相信以下内容应该会有所帮助:

您可以通过不同的方式访问结构中的元素:

ML.element1='hello world';
fieldName = 'element1';
disp(getfield(ML, fieldName));

如您所见,使用getfield 我可以访问一个元素,即使我在编写代码时不知道元素的名称(只要我在变量中有名称)。

同样,您可以使用setfield 创建一个元素:

setfield(ML, fieldName, 'goodbye world');
disp(ML.element1);

更新 - 如果您想索引特定(变量)字段名称的元素,您可以执行以下操作:

fieldname = 'one';
ML.(fieldname) = [123 234];
ML.(fieldname)(3) = 456;
disp(ML)

ML = 

  one: [123 234 456]

注意 - 诀窍在于字段(变量)名称周围的 () 括号中。

【讨论】:

  • 虽然我得到了你的例子,但我不太明白如何调用动态字段名,你将如何在需要索引到不同行的计算中做到这一点?
  • 也许让我改写我的问题,你如何索引一个特定的字段名?
  • 我花了一些时间,但这真的只是括号的事情。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2016-05-10
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多