【问题标题】:Vectorize/Accelerate looping through a struct of struct in Matlab?Vectorize/Accelerate循环通过Matlab中的结构结构?
【发布时间】:2016-03-11 12:38:16
【问题描述】:

我在 Matlab 的 R 中寻找类似于 sapply 函数 的东西。 我有当前的问题:

我有一个大小为1000的大struct,里面的每一个都是一个struct,也就是我有一个struct of struct

每一个substruct都是相同的样式,也就是相同的字段。

我正在使用一个函数对每个 substruct

做一些事情

代码如下:

 for i =1:length(mainStruct)
      disp(i);
      result(i) = myfunction(mainStruct(i).field(1:1000));
 end

上面,myfunction只是一个函数,ma​​inStructstruct的结构ma​​inStruct(i) 正在访问每个 subStruct

我尝试过 structfun,但它只适用于结构的字段名称,不适用于 struct of struct。

问题是如何摆脱这个循环?

【问题讨论】:

  • 您要求矢量化,但这需要 myfunction 已经矢量化。它接受矢量化输入吗?你能传递一个矩阵,它将每一行解释为一个向量吗?
  • 你试过把大结构变成数组吗?然后你可以做mainStruct(:).field(1:1000) 当然,正如丹尼尔指出的那样,你的函数必须被矢量化
  • @marcowassmer 我没听明白,你的意思是一个数组,数组中的每个元素都是一个结构体?
  • @Daniel myfunction 接受向量作为输入,例如 [1,2,3,4,5],单行。
  • @GeekCat,是的,这就是我的意思

标签: r matlab vectorization apply


【解决方案1】:

有一个函数myfunction 需要为每个向量单独调用,你不能向量化循环。你只能迭代。您可以使用arrayfun,它允许您将其写在一行中,但速度较慢。

result=arrayfun(@(x)myfunction(x.field(1:1000)),mainStruct)

MATLAB 中的 For 循环通常是迭代最快的(其中之一)。只有在不需要迭代时才避免使用它们。在这种情况下,myfunction 没有被矢量化,您需要迭代。

【讨论】:

  • 我试过 struct2array(mainStruct),它把我的 struct 结构变成了一个非常大的 Char 数组,完全搞砸了..
  • struct2array 对于允许您以矢量化方式一次输入所有数据的函数可能是一个不错的选择,但您告诉过这是不可能的。不知道你想做什么!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多