2

我正在尝试在 Matlab 中对以下数据结构进行矢量化,但我找不到/编码一种有效的方法。
A = 1x2 结构数组,字段: [a , b , c]
A(1) = a: 1 , b: 2 , c: [1x1 struct]
A(1).c = key: 5
A(2) = a : 1 , b: [] , c: [1x3 struct]
A(2).c = 1x3 结构数组,字段为:[key , key2]
A(2).c(1).key = 3
A(2)。 c(2).key = 4
A(2).c(3).key = 7
A(2).c(1).key2 = 10
A(2).c(2).key2 = []
A( 2).c(3).key2 = 17

我知道。这是一种非常低效的数据结构。这就是我尝试使用索引对其进行矢量化的原因,因此最终结构看起来像
A = 1x1 结构,其中包含字段 [a , b , c , b_index , c_index]
Aa = [1 1]
Ab = [2]
A.b_index = [1]
Ac = 1x1 结构与字段 [key key2 key2_index]
A.c_index = [1 2 2 2]
Ackey = [5 3 4 7]
Ackey2 = [10 17]
Ackey2_index = [2 4]

我的尝试1: 我首先在每个级别尝试了parfor(对于这个例子,具体来说:A,c,关键3个级别)首先进行调查,看看它是否为空,它包含什么数据,我需要索引这个场地。然后 vertcat(x.(fieldname)) 如果它不是结构叶。但如果是,我将其打包为一个单元格并递归地将其向下推以进行矢量化。

这行得通,但不幸的是,它需要的时间太长。当我对其进行配置文件时,它显示了一直占用的 mex 分布函数。我猜那是因为我在每个级别都在做 parfor,因此 MATLAB 必须在每个级别非常频繁地索引并分发给每个工作人员。

我的尝试2: 我已经尝试先对结构进行完全的 parfor 调查。为每个字段使用 uint8 值。然后在组合阶段,我先用vertcat查看调查结果,看是否需要索引,是否需要对数据字段做cat(3,...)。但这在调查阶段内存效率低且速度慢。并且在组合阶段并没有加速太多。尽管索引变得容易得多。

我想我的问题是
1. 如何以 parfor 仅索引和分发整个数组一次的方式对其进行编码,以便我的第一次尝试可以更有效,或者我的第二次尝试是一个更好的主意?
2. 解决问题的一般方法是什么?

4

1 回答 1

0

我为您的 2 分两分钱。问题:Matlabparfor在简单数组/矩阵上的工作速度更快。这是因为数组在内存中被传染地分配,因此可以更快地访问和计算。因此,如果您更关心程序的性能而不是可读性,我建议您使用更简单的数组等,而不是使用复杂的结构。

于 2015-10-27T09:51:55.823 回答