我想创建一个迭代几个字符串的循环,但是在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
是我使用字符串值
答案 0 :(得分:29)
或者你可以这样做:
for i={'cow','dog','cat'}
disp(i{1})
end
结果:
cow
dog
cat
答案 1 :(得分:5)
您的问题可能是由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 :(得分:2)
当然!使用单元格数组来保存字符串(在普通数组中,字符串是按字符考虑的,如果所有字符串具有相同的长度,则可以起作用,但否则会变钝)。
opts={'cow','dog','cat'}
for i=1:length(opts)
disp(opts{i})
end