цикл foreach со строками в Matlab - PullRequest
10 голосов
/ 22 марта 2012

Я хочу создать цикл, который будет повторять несколько строк, но не сможет сделать это в Matlab.

Что работает:

for i=1:3
  if (i==1)
    b='cow';
  elseif (i==2)
    b='dog';
  else
    b='cat';
  end

  disp(b);
end

и результат:

cow
dog
cat

Но то, что я хочу, это нечто более элегантное, что будет выглядеть так:

for i=['cow','dog','cat']
  disp (i);
end

и дать тот же результат.

Есть ли в Matlab возможность сделать это?

Сложение:

Позже мне понадобятся слова в виде строк, а не только для отображения (disp был просто в качестве примера). Я пытался использовать массивы ячеек в моей реальной программе:

clear all;
close all;
clc;

global fp_a
global TEST_TYPE
global SHADE_METHODE

for fp_a=11:24
for shade={'full','fast'}
    SHADE_METHODE=shade(1);
    for test={'bunny','city'}
        TEST_MODE=test(1);
        fprintf ('fp_a:%d | test: %s | shade: %s',fp_a,TEST_TYPE,SHADE_METHODE);
        ray_tracing;
    end
end
end

Не работает, так как значения остаются в виде ячеек, а не строк. Я получаю сообщение об ошибке:

??? Ошибка при использовании ==> fprintf Функция не определена для входов 'cell'.

* - мне не нужно fprintf, я просто использую его, чтобы проверить правильность значений.

** - ray_tracing - мой код, который использует значения строк

Ответы [ 3 ]

29 голосов
/ 22 марта 2012

Или вы можете сделать:

for i={'cow','dog','cat'}
   disp(i{1})
end

Результат:

cow
dog
cat
5 голосов
/ 22 марта 2012

Ваши проблемы, вероятно, вызваны тем, как MATLAB обрабатывает строки. Строки MATLAB - это просто массивы символов. Когда вы вызываете ['cow','dog','cat'], вы формируете 'cowdogcat', потому что [] объединяет массивы без вложенности. Если вы хотите вложения, вы можете использовать массивы ячеек, которые построены с использованием {}. for перебирает столбцы с правой стороны. Это означает, что вы можете использовать идиому, которую вы упомянули выше; Оли уже предоставил решение. Эта идиома также является хорошим способом продемонстрировать разницу между обычным и клеточным массивами.

%Cell array providing the correct solution
for word = {'cow','dog','cat'}
    disp(word{1}) %word is bound to a 1x1 cell array. This extracts its contents.
end

cow
dog
cat


%Normal array providing weirdness
for word = ['cow','dog','cat'] %Same as word = 'cowdogcat'
    disp(word) %No need to extract content
end

c
o
w
d
o
g
c
a
t
2 голосов
/ 22 марта 2012

Конечно! Используйте массивы ячеек для хранения строк (в обычных массивах строки рассматриваются как символьные, что может работать, если все строки имеют одинаковую длину, но в противном случае будет выполняться без ошибок).

opts={'cow','dog','cat'}
for i=1:length(opts)
    disp(opts{i})
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...