Есть ли foreach в MATLAB?Если да, то как он поведет себя, если базовые данные изменятся?

StackOverflow https://stackoverflow.com/questions/408080

  •  03-07-2019
  •  | 
  •  

Вопрос

Существует ли структура foreach в MATLAB?Если да, то что произойдет, если базовые данные изменятся (т.е.если объекты будут добавлены в набор)?

Это было полезно?

Решение

MATLAB's ДЛЯ цикл статичен по своей природе;вы не можете изменять переменную цикла между итерациями, в отличие от for(инициализация; условие;приращение) структура цикла на других языках.Это означает, что следующий код всегда выводит 1, 2, 3, 4, 5 независимо от значения B.

A = 1:5;

for i = A
    A = B;
    disp(i);
end

Если вы хотите иметь возможность реагировать на изменения в структуре данных во время итераций, В ТО ВРЕМЯ КАК петля может быть более подходящим - вы сможете проверять условие цикла на каждой итерации и устанавливать значения переменных цикла по своему усмотрению:

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

Кстати, тот для-каждого петля на языке Java (и, возможно, на других языках) приводит к неопределенному поведению, когда структура данных изменяется во время итерации.Если вам нужно изменить структуру данных, вы должны использовать соответствующий Итератор экземпляр, который позволяет добавлять и удалять элементы в коллекции, которую вы повторяете.Хорошей новостью является то, что 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

Первый цикл создает переменную i это скаляр, и он повторяет его как цикл C for.Обратите внимание, что если вы измените i в теле цикла измененное значение будет проигнорировано, как говорит Зак.Во втором случае Matlab создает массив из 10 тысяч элементов, затем обходит все элементы массива.

Это означает , что

for i=1:inf
  % do something
end

работает, но

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

не делает (потому что для этого потребовалось бы выделить бесконечную память).Видишь Блог Лорен за подробностями.

Также обратите внимание, что вы можете выполнять итерации по массивам ячеек.

Математическая ЛАБОРАТОРИЯ для цикл в принципе обеспечивает огромную гибкость, включая функциональность.Вот несколько примеров:

1) Определите начальный, инкрементный и конечный индексы

for test = 1:3:9
   test
end

2) Цикл по вектору

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

3) Зациклите на струне

for test = 'hello'
   test
end

4) Цикл по одномерному массиву ячеек

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

5) Цикл по двумерному массиву ячеек

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

6) Используйте имена полей структурных массивов

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

Если вы пытаетесь выполнить цикл по массиву ячеек и применить что-то к каждому элементу в ячейке, проверьте cellfun.Есть также arrayfun, bsxfun, и structfun это может упростить вашу программу.

оо!отличный вопрос.

Цикл for Matlab принимает матрицу в качестве входных данных и выполняет итерацию по ее столбцам.Matlab также обрабатывает практически все по значению (без передачи по ссылке), поэтому я бы ожидал, что он делает снимок входных данных for-цикла, поэтому он неизменяем.

вот пример, который может помочь проиллюстрировать:

>> 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

При переборе массивов ячеек строк переменная цикла (давайте назовем ее f) становится одноэлементным массивом ячеек.Необходимость писать f{1} везде становится утомительно, и изменение переменной цикла обеспечивает чистое обходное решение.

% This example transposes each field of a struct.
s.a = 1:3;
s.b = 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  ]

тогда вы можете "предначертать" это следующим образом:

for i = n, i, end

Это отразит каждый элемент в n (но, конечно, возможна замена i на более интересные вещи!)

Я думаю, это то, чего действительно хочет ОП:

array = -1:0.1:10

for i=1:numel(array)
    disp(array(i))
end

По состоянию на сегодняшний день (27 февраля), в файлообменнике MATLAB для каждого набора инструментов есть новый это реализует концепцию foreach. foreach не является частью языка MATLAB, но использование этого набора инструментов дает нам возможность эмулировать то, что foreach сойдет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top