Matlab:迭代多个结构

Matlab:迭代多个结构,matlab,for-loop,struct,Matlab,For Loop,Struct,我有5个Matlab结构。我想重复一下。我目前的解决方案如下: all_structs = [struct1,struct2,struct3,struct4,struct5]; for single_struct = all_structs % do stuff to each struct here end 但是,上面的每个结构都有一个包含大量数据(包括一些其他属性)的矩阵。此外,我在单_结构中所做的任何更改都不会传递回原始的结构 问题:我该如何解决?当我创建向量all_struct

我有5个Matlab结构。我想重复一下。我目前的解决方案如下:

all_structs = [struct1,struct2,struct3,struct4,struct5];
for single_struct = all_structs
    % do stuff to each struct here
end
但是,上面的每个结构都有一个包含大量数据(包括一些其他属性)的矩阵。此外,我在
单_结构
中所做的任何更改都不会传递回原始的
结构

问题:我该如何解决?当我创建向量
all_structs
时,Matlab是否再次复制所有数据?或者是来自每个结构(
struct1,…,struct5
)的数据通过引用传递?有没有更好的方法来迭代多个结构


谢谢你的帮助

struct
将不会通过引用传递。您需要使用索引在
all_structs
中的元素上循环,然后使用该索引进行访问和修改。如果需要将某个对象视为引用,则需要为其定义一个类,并使该类继承自
handle


我还建议您阅读
arrayfun
,不过如果您想执行操作并获得结果,这会很有用。根据您的描述,听起来您想修改结构。

struct
将不会通过引用传递。您需要使用索引在
all_structs
中的元素上循环,然后使用该索引进行访问和修改。如果需要将某个对象视为引用,则需要为其定义一个类,并使该类继承自
handle


我还建议您阅读
arrayfun
,不过如果您想执行操作并获得结果,这会很有用。根据您的描述,听起来您想修改结构。

如果您想修改原始结构的内容,而不制作副本,您可以使用结构名称的单元格数组。
然后迭代名称,并使用
eval
修改内容。
使用
eval
效率低下,所以不要养成习惯

请参阅以下代码示例:

%Create sample structs (each struct has a data element).
struct1.data = 1;
struct2.data = 2;
struct3.data = 3;

%Create a cell array containing structs names as strings.
struct_names = {'struct1', 'struct2', 'struct3'};

%Iterate all structs names
%Modify data elements of each struct using eval.
for i = 1:length(struct_names)
    sname = struct_names{i}; %Get struct name from cell array.

    %Evaluate a string like: 'struct1.data = struct1.data + 1;'
    eval([sname, '.data = ', sname, '.data + 1;']);
end

如果要修改原始结构的内容而不复制,可以使用结构名称的单元格数组。
然后迭代名称,并使用
eval
修改内容。
使用
eval
效率低下,所以不要养成习惯

请参阅以下代码示例:

%Create sample structs (each struct has a data element).
struct1.data = 1;
struct2.data = 2;
struct3.data = 3;

%Create a cell array containing structs names as strings.
struct_names = {'struct1', 'struct2', 'struct3'};

%Iterate all structs names
%Modify data elements of each struct using eval.
for i = 1:length(struct_names)
    sname = struct_names{i}; %Get struct name from cell array.

    %Evaluate a string like: 'struct1.data = struct1.data + 1;'
    eval([sname, '.data = ', sname, '.data + 1;']);
end

请记住,
arrayfun
比单个
for
循环慢。请记住,
arrayfun
比单个
for
循环慢。“使用eval效率低,所以不要养成习惯…”为什么推荐坏习惯?@EBH在某些情况下,使用eval是最好的选择。在给定sturct时(首先不是在数组中),使用eval看起来比创建结构数组和从现在开始使用数组元素更好。了解
eval
选项很重要,但在不必要时不要使用它。这种方法可以解决问题,但我不推荐使用。如果可能,应避免使用
eval
,如果可能,代码中不应使用裸式eval。我宁愿建议使用catenate结构,尽管它会占用一些额外的时间和内存(临时内存开销)。“使用eval效率低下,所以不要养成习惯…”为什么要推荐坏习惯?@EBH在某些情况下,使用eval是最好的选择。在给定sturct时(首先不是在数组中),使用eval看起来比创建结构数组和从现在开始使用数组元素更好。了解
eval
选项很重要,但在不必要时不要使用它。这种方法可以解决问题,但我不推荐使用。如果可能,应避免使用
eval
,如果可能,代码中不应使用裸式eval。我更倾向于建议使用catenate结构,尽管这将需要一些额外的时间和内存(临时内存开销)。听起来好像最初的问题是结构不是结构数组。我建议您尝试修复原始问题。我知道这有时会很复杂,但我相信,除此之外,你必须忍受这种开销。如果你这样做一次,时间延迟就不会那么糟糕了。在答案中有一个带有
eval
的解决方案,但我不推荐它。如果内存出现故障,您也可以分步执行。@patrik嘿,这是一个非常有用的建议。因此,我不应该创建一堆结构,而应该创建一个结构数组,它类似于包含结构的结构。是这样吗?就是这样做的。这里值得注意的是,所有结构都有相同的字段,这些字段中的矩阵大小相同。struct元素可以像数组一样被访问,
numel(s(1).a)==N;努梅尔(s(2.a)=N
。如果矩阵大小不同,则必须使用
单元格
数组。通过操作符
{}
numel(c{1})==N来访问它们;numel(c{2}~=N)
。听起来好像最初的问题是结构不是结构数组。我建议您尝试修复原始问题。我知道这有时会很复杂,但我相信,除此之外,你必须忍受这种开销。如果你这样做一次,时间延迟就不会那么糟糕了。在答案中有一个带有
eval
的解决方案,但我不推荐它。如果内存出现故障,您也可以分步执行。@patrik嘿,这是一个非常有用的建议。因此,我不应该创建一堆结构,而应该创建一个结构数组,它类似于包含结构的结构。是这样吗?就是这样做的。这里值得注意的是,所有结构都有相同的字段,这些字段中的矩阵大小相同。struct元素可以像数组一样被访问,
numel(s(1).a)==N;努梅尔(s(2.a)=N
。以防万一