【问题标题】:How to use a for loop with an if statement如何使用带有 if 语句的 for 循环
【发布时间】:2019-02-25 02:09:20
【问题描述】:

我是编程新手,无法解决这个问题:

clear all
close all
clc
x = [2 * rand(10)-1];
y = [2 * rand(10)-1];
p_i = sqrt(x.^2 + y.^2)
n = 0;
for k = 1:100
  if p_i <= 1
    n = n + 1
  end
end
n

它给了我答案n = 0。我的目的是计算 100 次 p_i 中有多少次小于 1。我有两个问题: 我该如何解决这个问题?但更重要的是,MATLAB 是如何读取我的代码的?

【问题讨论】:

    标签: matlab for-loop if-statement


    【解决方案1】:

    您的 for 循环运行了 100 次。每次循环遇到p_i &lt;= 1 时,它会将语句评估为False,而不是进入if 语句。该语句是False,因为p_i 包含大于1 的值,因此不能将整个矩阵评估为小于1。

    为了更好地了解您的代码是如何运行的,您可以在运行脚本之前在 p_i &lt;= 1 行创建一个断点。然后,一旦你的断点被命中并且你的代码被暂停,你就可以单步执行每一行代码。

    【讨论】:

      【解决方案2】:

      这取决于你的确切意图。

      rand(10) 产生一个矩阵10x10,其随机数均匀分布在01 之间。所以p_i 是矩阵10x10,当你进行比较p_i&lt;=1 时,你会得到另一个矩阵,它有逻辑值,你可以总结。

      x = 2*rand(10)-1;
      y = 2*rand(10)-1;
      p_i = sqrt(x.^2 + y.^2);
      n = sum(sum(p_i<=1))
      n = sum(p_i(:)<=1) % from @XiangruiLi
      n = sum(p_i<=1,'all') % from @CrisLuengo, requires MATLAB 2018b
      

      或者,您可以使用向量而不是矩阵来编写;

      samples = 100;
      x = 2*rand(samples,1)-1;
      y = 2*rand(samples,1)-1;
      p_i = sqrt(x.^2 + y.^2);
      n = sum(p_i<=1)
      

      第二个问题

      for 循环不起作用,因为您需要指定要查看的索引:

      for k = 1:100
          if p_i(k) <= 1
              n = n + 1
          end
      end
      

      要使语句p_i &lt;= 1 为真,矩阵的每个值都必须满足条件。

      【讨论】:

      • MATLAB R2018b 中的新功能:sum(p_i&lt;=1,'all') -- 我很激动,我必须让大家知道。 :)
      • 你可以做 n = sum(p_i(:)
      • @XiangruiLi 这是一种更简洁的方式,我总是想将它添加到(p_i&lt;=1)(:),类似于它在 python 中的工作方式,但这在 matlab 中不起作用。 @CrisLuengo 非常感谢
      • 感谢大家的快速响应。但是,我仍然有一个问题,为什么我的循环不起作用。我问这个是因为我试图理解我可以用“for”、“if”和“while”等命令做什么。
      • @BjornvanBraak 扩展了答案
      【解决方案3】:

      您必须选择 p_i 矩阵的第 k_th 值。类似的东西:

      clear all
      close all
      clc
      x = [2 * rand(10)-1];
      y = [2 * rand(10)-1];
      p_i = sqrt(x.^2 + y.^2);
      n = 0;
      for k = 1:100
        if p_i(k) <= 1
          n = n + 1;
        end
      end
      n
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多