【问题标题】:Change for loop index variable inside the loop更改循环内的循环索引变量
【发布时间】:2011-02-19 09:28:30
【问题描述】:

我需要在迭代中更改我的循环变量,因为我必须访问循环中的数组元素,这正在改变循环内的 w.r.t 大小。

这是我的代码 sn-p:

que=[];
que=[2,3,4];
global len;
len=size(que,2)
x=4;
for i=1:len 
    if x<=10
    que(x)= 5;
    len=size(que,2)
    x=x+1;

    end
end
que

数组应该打印如下:

2 3 4 5 5 5 5 5 5 5 

但它是这样打印的:

2 3 4 5 5 5

在 Visual C++ 中,该数组被正确计算并打印出包含 10 个元素的整个数组,该数组在运行时会增加。

如何在 Matlab 中完成此操作?

【问题讨论】:

    标签: matlab dynamic loops indexing for-loop


    【解决方案1】:

    您应该使用while loop 而不是for loop 来执行此操作:

    que = [2 3 4];
    x = 4;
    while x <= 10
      que(x) = 5;
      x = x+1;
    end
    

    或者,您可以通过以下方式之一通过vectorizing your code 完全避免使用循环:

    que = [2 3 4];             %# Your initial vector
    %# Option #1:
    que = [que 5.*ones(1,7)];  %# Append seven fives to the end of que
    %# Option #2:
    que(4:10) = 5;             %# Expand que using indexing
    

    【讨论】:

    • 但我事先不知道数组 wud 的大小增加了多少。这只是一个例子。实际上数组的大小会根据条件动态增加。有时它会增加 bt 2 个元素 n 有时增加 3,有时 n 增加非。
    • @shawana:即便如此,您仍然希望使用 while 循环或我给出的矢量化解决方案之一。 For 循环被设计为循环固定次数,这在循环开始时是已知的。如果您必须循环的次数基于某些条件,则应使用 while 循环。但是,我认为最好使用矢量化代码而不是循环来处理您的情况。
    【解决方案2】:

    是的,您可以使用 (while) 循环,但为什么呢?学习 MATLAB 的做事方式。避免这个不需要存在的循环。

    例如,使用这行代码,它只是添加了需要添加的任意数量的元素。

    que = [que,repmat(5,1,10 - length(que))];
    

    如果您有其他方法来确定此变量的目标是多长时间,仍然可以使用类似的方案在一行中创建数组。

    我可能还会问,为什么您在发布的代码中将 len 定义为全局变量?

    【讨论】:

      【解决方案3】:

      您的返回向量正是您编码的内容。 for 循环将运行 3 次 - que 向量的长度,这就是为什么你得到三个 5 而不是七个。在循环内更改len 将无济于事,因为i 变量的范围是在for 循环开始之前确定的,并且无法在运行时更改。换句话说,一旦 for 循环开始,它就会忘记 len 是什么,它只记得 i 必须从 1 更改为 3。


      初始x 是否总是等于length(que)+1

      假设 x=5,您期望什么向量? 2 3 4 0 5 5 5 5 5 5?或2 3 4 5 5 5 5 5 5

      还是2 3 4 5 5 5 5 5 5 5? (实际上并不依赖于 x)

      在第一种情况下,最好的 matlab-ish 解决方案来自@gnovice:

      que = [2 3 4];  
      x = 5;
      y = 10;
      val = 5;
      que(x:y)=val;
      

      在第二种情况下,@gnovice 的另一个解决方案:

      que = [2 3 4];
      x = 5;
      y = 10;
      val = 5;
      que = [que, val.*ones(1,y-x+1)];
      

      que = [que, repmat(val, 1, y-x+1)];
      

      在第三种情况下,是@woodchips 的解决方案:

      que = [que, repmat(val, 1, y - length(que))];
      

      在您的情况下,使用循环(for 或 while)非常糟糕,因为在每个循环中,您都会通过内存重新分配来增加 que 向量的大小。

      【讨论】:

        【解决方案4】:

        Matlab 中的程序循环性能很差。正如其他人所说,使用matlab内置函数并尽可能矢量化所有内容。如果你真的需要循环结构,也许 C 对你来说会是一个更好的选择:)

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2013-06-03
          • 2016-06-02
          • 2018-01-12
          • 1970-01-01
          • 2020-10-23
          • 2013-09-13
          相关资源
          最近更新 更多