在Matlab中使用字符串的foreach循环

10
我想创建一个循环,用于迭代多个字符串,但在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 只是一个示例)。我已经尝试在我的真实程序中使用 cell 数组:
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

这不起作用,因为值仍然保持为单元格而不是字符串,我收到以下错误消息:

??? Error using ==> fprintf 对于“cell”输入未定义函数。

*- 我实际上并不需要 fprintf,我只是用它来检查值是否正确。

**- ray_tracing 是我的代码,它使用这些字符串的值。


2
加法运算问题仅仅是语法。你需要使用花括号 - test{1} - 从单元格中提取字符数组,而不是普通的括号 - test(1) - 括号只是选择数组中的第一个单元格,在这里没有实际作用。再次检查Oli的示例代码;请注意,他在 i {1} 中使用了花括号。(此外,如果可以避免,请勿使用全局变量。) - Andrew Janke
你应该使用 SHADE_METHODE=shade{1}; 而不是 SHADE_METHODE=shade(1); - Oli
4个回答

31

或者您可以这样做:

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

结果:

cow
dog
cat

8
不错。如果不是每个与编写Matlab有关的真正美好之处都被某些特别可怕的东西抵消了,那该多好啊。 - beOn

6
你的问题可能是由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

2
当然可以!使用单元数组来存储字符串(在普通数组中,字符串按字符考虑,如果所有字符串长度相同,则可以工作,但否则会出错)。
opts={'cow','dog','cat'}
for i=1:length(opts)
    disp(opts{i})
end

1

在R2017a版本中引入了字符串数组的使用。请注意双引号:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接