我是编程的新手,对此有疑问:
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
。我的目的是让它计算p_i
的100倍小于1的次数。我有两个问题:
我该如何解决这个问题?但是更重要的是MATLAB如何读取我的代码?
答案 0 :(得分:3)
这取决于您的确切意图。
rand(10)
产生矩阵10x10
,其矩阵的随机数均匀分布在0
和1
之间。因此p_i
是矩阵10x10
,当您进行比较p_i<=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 <= 1
为真,矩阵的每个值都必须满足条件。
答案 1 :(得分:3)
您的for循环正在运行100次。每次循环遇到p_i <= 1
时,它会将语句评估为False
,而不是进入if
语句内部。该语句为False
,因为p_i
包含大于1
的值,因此,整个矩阵不能被评估为小于1。
为更好地了解代码的运行方式,可以在运行脚本之前在p_i <= 1
行创建一个断点。然后,一旦命中断点并暂停了代码,就可以逐步执行每一行代码。
答案 2 :(得分:2)
您必须选择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