MATLAB有没有foreach? 如果是这样,如果基础数据发生变化,它将如何performance?

MATLAB中是否有foreach结构? 如果是这样,如果基础数据发生变化(即如果对象被添加到集合中)会发生什么?

MATLAB的FOR循环本质上是静态的; 您不能在迭代之间修改循环variables,这与其他语言的for(initialization; condition; increment)循环结构不同。 这意味着下面的代码总是打印1,2,3,4,5,而不pipeB的值如何。

A = 1:5; for i = A A = B; disp(i); end 

如果你想在迭代期间响应数据结构的变化,那么WHILE循环可能更合适 – 你可以在每次迭代中testing循环条件,并设置循环variables的值( s)如你所愿:

 n = 10; f = n; while n > 1 n = n-1; f = f*n; end disp(['n! = ' num2str(f)]) 

顺便说一句, Java中的for-each循环(以及可能的其他语言)在迭代期间修改数据结构时会产生未指定的行为。 如果您需要修改数据结构,则应该使用适当的Iterator实例,该实例允许添加和删除正在迭代的集合中的元素。 好消息是MATLAB支持Java对象,所以你可以这样做:

 A = java.util.ArrayList(); A.add(1); A.add(2); A.add(3); A.add(4); A.add(5); itr = A.listIterator(); while itr.hasNext() k = itr.next(); disp(k); % modify data structure while iterating itr.remove(); itr.add(k); end 

扎克对这个问题的直接回答是正确的。

有趣的一面是,以下两个循环不会执行相同的操作:

 for i=1:10000 % do something end for i=[1:10000] % do something end 

第一个循环创build一个variablesi ,它是一个标量,它像C for循环一样迭代它。 请注意,如果您在循环体中修改i ,则修改的值将被忽略,如Zach所述。 在第二种情况下,Matlab创build一个10k元素的数组,然后遍历数组中的所有元素。

这意味着什么

 for i=1:inf % do something end 

作品,但是

 for i=[1:inf] % do something end 

不(因为这将需要分配无限的内存)。 详情请参阅Loren的博客 。

另外请注意,您可以遍历单元格数组。

如果你试图遍历一个单元格数组,并将某些东西应用到单元格中的每个元素,请检查cellfun 。 还有可能简化你的程序的arrayfunbsxfunstructfun

哦! 整洁的问题。

Matlab的for循环将matrix作为input并迭代其列。 Matlab也通过值来处理几乎所有的东西(不通过引用),所以我期望它能够获得for循环的input的快照,所以它是不可变的。

这里有一个例子可以帮助说明:

 >> A = zeros(4); A(:) = 1:16 A = 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 >> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 >> A A = 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 

MATLAB for循环基本上允许很大的灵活性,包括foreachfunction。 这里有一些例子:

1)定义开始,增量和结束索引

 for test = 1:3:9 test end 

2)循环向量

 for test = [1, 3, 4] test end 

3)在string上循环

 for test = 'hello' test end 

4)在一维单元arrays上循环

 for test = {'hello', 42, datestr(now) ,1:3} test end 

5)在二维单元arrays上循环

 for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)} test(1) test(2) disp('---') end 

6)使用结构数组的字段名

 sa = 1:3 ; sb = 10 ; for test = fieldnames(s)' s.(cell2mat(test)) end 

当遍历string的单元数组时,循环variables(我们称之为f )变成单元素单元数组。 不得不在每个地方编写f{1}变得单调乏味,修改循环variables提供了一个干净的解决方法。

 % This example transposes each field of a struct. sa = 1:3; sb = zeros(2,3); s % a: [1 2 3]; b: [2x3 double] for f = fieldnames(s)' s.(f{1}) = s.(f{1})'; end s % a: [3x1 double]; b: [3x2 double] % Redefining f simplifies the indexing. for f = fieldnames(s)' f = f{1}; s.(f) = s.(f)'; end s % back to a: [1 2 3]; b: [2x3 double] 

假设您有一组数据:

 n = [1 2 3 4 6 12 18 51 69 81 ] 

那么你可以像这样“foreach”:

 for i = n, i, end 

这将会回应n中的每一个元素(但当然也可以用更有趣的东西代替i)

我认为这是OP真正想要的:

 array = -1:0.1:10 for i=1:numel(array) disp(array(i)) end 

截至今天(2月27日), MATLAB File Exchange上有一个新的For-Each工具箱,它完成了foreach的概念。 foreach不是MATLAB语言的一部分,但是这个工具箱的使用使我们能够模拟foreach会做什么。