如何在不使用matlab中的for循环的情况下更改结构的某些特定字段?

如何在不使用matlab中的for循环的情况下更改结构的某些特定字段?,matlab,structure,field,Matlab,Structure,Field,让我们假设,我们有一个结构,并且希望在一些所需索引中更改相同的字段,而不使用昂贵的for循环。 有人能提出解决办法吗 例如: 假设我们有一个名为student的结构,我们希望在必要时更改字段“average”(学生编号125、编号231、编号245、编号256等等)。我知道我们应该写如下: should2change = [125, 231, 245, 256, ....]; for i = 1:numel(should2change) student(should2change(i,

让我们假设,我们有一个结构,并且希望在一些所需索引中更改相同的字段,而不使用昂贵的for循环。 有人能提出解决办法吗

例如:

假设我们有一个名为student的结构,我们希望在必要时更改字段“average”(学生编号125、编号231、编号245、编号256等等)。我知道我们应该写如下:

should2change = [125, 231, 245, 256, ....];

for i = 1:numel(should2change)

   student(should2change(i,1)).average = student(should2change(i,1)).average + 1;

end

有没有一种简单的方法可以避免在执行完全相同的任务时使用这种代价高昂的for循环?

据我所知,没有一种很好的方法可以绕过for循环——如果您不知道要提前访问哪些元素的话。但是,如果您真的愿意,可以执行所谓的循环展开(loop unrolling),将指令写出x次,而不是执行for循环x次。例如,如果您知道should2change(这里是s2c)将始终有5项,那么您可以:

student(s2c(1,1).average = s2c(1,1).avg+1
student(s2c(2,1).average = s2c(2,1).avg+1
student(s2c(3,1).average = s2c(3,1).avg+1
student(s2c(4,1).average = s2c(4,1).avg+1
student(s2c(5,1).average = s2c(5,1).avg+1
也许这可以并行化,但除非它真的能提高性能,否则我不会担心


我不认为这就是你想要的,在这种情况下,for循环可能是最好的。但是for循环在matlab中并不太昂贵。唯一一次你真正需要担心的是,如果你开始为循环嵌套(总是一个坏主意)。

我认为你介绍的解决方案是好的,但我不知道每次我的递归程序想要执行相同的任务时,应该更改多少索引。好吧,那么for循环是你最好的选择,因为您可以在运行时更改迭代次数。如果你知道会有偶数的变化,你至少可以一次做两个变化,但除此之外,是的。。。对于循环,这就是它们的用途。您分析过您的实际问题吗?所展示的循环需要几毫秒才能运行。事实上,我不确定“for loops”是否是我的实际问题,但我确信我的代码必须多次运行相同的循环,大多数时候我的代码运行非常缓慢,而我的笔记本电脑上有16 Gb的ram,我的CPU是core i7!在下面运行您的函数。你所做的闻起来像是过早的优化。