【问题标题】:MATLAB - Get single field name from struct [duplicate]MATLAB - 从结构中获取单个字段名称[重复]
【发布时间】:2021-04-30 09:10:39
【问题描述】:

我的问题是,您能否在一个函数中提取 MATLAB 中结构的一个字段名称。目前我正在这样做

sb = 3;
TestData.Name1 = [1 2 3];
TestData.Name2 = [4 5 6];
TestData.Name3 = [7 8 9];
TestData.Name4 = [10 11 12];
condition = fieldnames(TestData);
condition = condition{sb}

所以条件会出现

condition = 

    Name3

我想知道是否可以通过这样的方式做更多的事情

condition = fieldnames(TestData{sb});

不是一个需要解决的基本问题,但最好让代码更优雅一些

【问题讨论】:

  • obj.Model.TestData2 是什么?
  • 它是一个 1x1 结构,包含 8 个 37295x1 双数组,我想要做的就是提取一个数组的名称,而无需分两行完成
  • 请发布一个定义所有变量的最小示例,以便我们运行您的代码。当你这样做时让我知道,这样我就可以删除我的反对票
  • 抱歉,我在这里提供了一个简化的例子 TestData.Name1 = [1 2 3]; TestData.Name2 = [4 5 6]; TestData.Name3 = [7 8 9]; TestData.Name4 = [10 11 12];某人= 3;条件 = 字段名(TestData)条件 = 条件{sb}
  • 我现在知道你想做什么了。我想不出任何简单的方法可以根据需要直接索引。您可以将subsref 用作here,但这是一团糟。另外,您是否知道字段的顺序是创建顺序,因此可能不可靠?我的意思是,例如尝试test1.a = 10; test1.b = 20; test2.b = 20; test2.a = 10; fieldnames(test1), fieldnames(test2)

标签: matlab oop struct


【解决方案1】:

如果您不介意在代码中的某处定义辅助函数 - 您可以将其作为单行匿名函数赋值来执行 - 那么您可以这样做:

curly = @(cellArray, index) cellArray{index};

function item = curly(cellArray, index)
    item = cellArray{index};
end

然后

>> curly({'foo', 'bar', 'bas'}, 2)
ans =
    'bar'

>> curly(fieldnames(TestData), sb)
ans =
    'Name3'

这是在 MATLAB File Exchange 上的 Functional Programming Constructs 包中实现的 - 如果您从 Add-on Explorer 安装该包,您可以使用它提供的函数而无需自己定义它们,但是您需要记住您的如果您与他人共享您的代码,则代码具有该依赖性。

为了完整起见,没有任何外部依赖的完全可怕的单行方法是

subsref(fieldnames(TestData), struct('type', '{}', 'subs', {{sb}}))

【讨论】:

  • 鉴于我使用的代码需要与其他用户共享,这可能不是最佳解决方案,但我会研究一下
  • 如果您不想要依赖,但又想在一个文件中多次使用该语法,您可以将其定义为本地或嵌套函数(或私有类方法)。这取决于您是使用笨拙但标准的多行语法更好,还是让阅读您的代码的人需要检查curly 的作用。 (我称它为curly,因为文件交换包就是这么称呼它的,但如果你想清楚的话,你可以称它为selectItemFromCellArray。)
  • 老实说,我认为condition = fieldnames(TestData); condition = condition{sb}; 比您发布的两个中的任何一个都更好。 :) 还是不错的提议。 +1
  • 另外,看看substruct,它使subsref 调用变得简单了很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
相关资源
最近更新 更多