【问题标题】:foreach loop with strings in MatlabMatlab中带有字符串的foreach循环
【发布时间】:2012-04-07 05:40:12
【问题描述】:

我想创建一个循环遍历多个字符串,但在 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 是我使用字符串值的代码

【问题讨论】:

  • 加法中的问题只是语法。您需要使用花括号 - test{1} - 从单元格中提取字符数组,而不是普通括号 - test(1) - 它只是选择数组中的第一个单元格,实际上在这里什么都不做。再次查看 Oli 的示例代码;请注意,他在i{1} 中使用了花括号。 (另外,如果可以避免的话,不要使用全局变量。)
  • 你应该使用SHADE_METHODE=shade{1};而不是SHADE_METHODE=shade(1);

标签: matlab foreach


【解决方案1】:

或者你可以这样做:

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

结果:

cow
dog
cat

【讨论】:

  • 不错。如果在 Matlab 中编写的每一件真正美好的事情都没有被真正可怕的东西所抵消。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当然!使用元胞数组来保存字符串(在普通数组中,字符串是按字符来考虑的,如果所有字符串都具有相同的长度,这可能会起作用,否则会失败)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2013-11-08
      • 2013-11-02
      • 2019-08-24
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多