Ответ 1
Или вы можете сделать:
for i={'cow','dog','cat'}
disp(i{1})
end
Результат:
cow
dog
cat
Я хочу создать цикл, который будет перебирать несколько строк, но не может сделать это в 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
- это мой код, который использует значения строк
Или вы можете сделать:
for i={'cow','dog','cat'}
disp(i{1})
end
Результат:
cow
dog
cat
Ваши проблемы, вероятно, вызваны тем, как 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
Конечно! Используйте массивы ячеек для хранения строк (в обычных массивах строки считаются символами, которые могут работать, если все строки имеют одинаковую длину, но в противном случае будут работать).
opts={'cow','dog','cat'}
for i=1:length(opts)
disp(opts{i})
end