цикл foreach со строками в Matlab
Я хочу создать цикл, который будет перебирать несколько строк, но не может сделать это в 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 не определена для входных данных "ячейки".
*-мне не нужны fprintf
Я просто использую его, чтобы проверить правильность значений.
** -ray_tracing
это мой код, который использует значения из строки
3 ответов
ваши проблемы, вероятно, вызваны тем, как MATLAB обрабатывает строки. Строки MATLAB - это просто массивы символов. Когда вы звоните ['cow','dog','cat']
, вы формируете 'cowdogcat'
, потому что []
объединяет массивы без каких-либо вложений. Если вы хотите поведение вложенности, вы можете использовать массивы ячеек, которые построены с использованием {}
. for
перебирает столбцы справа. Это означает, что вы можете использовать идиому, упомянутую выше; Oli уже предоставил решение. Эта идиома также является хорошим способом покажите разницу между нормальным и клеточным массивами.
%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