【问题标题】:conditional statement with for loop带有 for 循环的条件语句
【发布时间】:2014-08-30 23:36:41
【问题描述】:

不知道我在这里做错了什么;

我正在尝试为以下函数创建一个带有条件语句的 for 循环。不过我想做到,所以h 不是向量。我从 1 到 5 执行此操作,增量为 0.1。

Y = f(h) = h^2    if h <= 2 or h >= 3
Y = f(h) = 45     otherwise

我的代码是

for h = 0:0.1:5
if h <= 2;
   Y = h^2;
elseif h >= 3;
Y = h^2;
else;
   h = 45;
end
end

【问题讨论】:

  • h 必须从 1 开始; Matlab 要求。在您的“其他”条件下,您的意思是 Y = 45?看起来循环永远不会达到这个 else 条件,因为 h>=3 直到 h 等于 5 才会为真。
  • for start:inc:end \ ...,就像那样,这些都不是1,甚至不是整数。
  • OP 也有Y = f(t) = h^2t 的函数,甚至没有使用变量t
  • 哦,天哪,你说得对,我想到了一个关于我开始的错误:价值,但当然它可以是任何东西,感谢您指出这一点!

标签: matlab loops if-statement for-loop conditional


【解决方案1】:

这可以更容易完成,但我认为你可以使用 for 循环:

h=0:0.1:5;
y=zeros(1,length(h));

for i=1:length(h)
    if or(h(i) <= 2, h(i) >= 3)
       y(i) = h(i)^2;
    else
       y(i) = 45;
    end
end

【讨论】:

  • 更多 matlab-y 答案:h=0:0.1:5; y = h.^2; y(h &gt;= 2 &amp; h &lt;= 3) = 45;
  • 这当然是很好的 MATLAB 风格,但他想使用 for-loops :)
【解决方案2】:

为什么要避免将h 设为数组? MATLAB 专注于对数组的操作。事实上,MATLAB 中的vectorized operations 循环通常比for 循环快,我发现在开始使用 C++ 编写代码时这违反直觉。

您的代码的矢量化版本示例可能是:

h = 0:0.1:5;
inds = find(h > 2 & h < 3);  % grab indices where Y = 45
Y = h.^2;  % set all of Y = h^2
Y(inds) = 45;  % set only those entries for h between 2 and 3 to 45

.^2 运算符中的句点将该运算符广播到h 数组中的每个元素。这意味着您最终会分别对 h 中的每个数字进行平方。一般来说,像这样的向量化操作在 MATLAB 中效率更高,因此最好养成对代码进行向量化的习惯。

最后,您可以通过不存储索引来稍微减少上述代码:

h = 0:0.1:5;
Y = h.^2;  % set all of Y = h^2
Y(find(h > 2 & h < 3)) = 45;  % set only those entries for h between 2 and 3 to 45

This blog series 似乎是向量化 MATLAB 代码的一个很好的入门读物。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2022-12-07
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多