forelab循环使用Matlab中的字符串

时间:2012-03-22 16:00:40

标签: matlab foreach

我想创建一个迭代几个字符串的循环,但是在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 个答案:

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