【问题标题】:Matlab simple loop not plotting correctlyMatlab简单循环未正确绘制
【发布时间】:2015-11-17 21:03:14
【问题描述】:

我是一个 Matlab 新手,我想弄清楚为什么我的简单循环不会像它应该做的那样绘制。

更新代码(从 8/25 下方的评论移出)

rent_1=1400;
rent_2=1560;
b = zeros(1,10);
month_count = 1:10

y = month_count * rent_1;

for i = 1:10 
   if i == 1 | i == 2 | i == 3 
      b(1,i)=rent_2 * (i-0.5040); 
   elseif i == 4 
      b(1,i)=rent_2*(i-0.6300);
   elseif i == 5 
      b(1,i)=rent_2*(i-0.7565); 
   elseif i == 6 
      b(1,i)=rent_2*(i-0.8825); 
   elseif i == 7 
      b(1,i)=rent_2*(i-1.0085); 
   elseif i == 8 
      b(1,i)=rent_2*(i-1.1345); 
   else 
      b(1,i)=rent_2*(i-1.2605); 
   end 
end 

figure,
plot(month_count,y,i,b(1,i))

原始代码(8/24 发布):

rent_1=1400;
rent_2=1560;
b = zeros(1,10);
month_count = 1:10

y = month_count * rent_1;

if i=1:3
    for 1:3,
        b(1,i)=rent_2(i-0.5040);
    end
elseif i == 4
    b(1,i)=rent_2(i-0.6300);
elseif i == 5
    b(1,i)=rent_2(i-0.7565);
elseif i == 6
    b(1,i)=rent_2(i-0.8825);
elseif i == 7
    b(1,i)=rent_2(i-1.0085);
elseif i == 8
    b(1,i)=rent_2(i-1.1345);
else
    b(1,i)=rent_2(i-1.2605);
end

figure,
plot(month_count,y,i,b(1,i))

非常感谢您的反馈。马克斯·凯瑟。

【问题讨论】:

  • 你能简单解释一下你的代码吗?您有几个错误发生,如果我们不知道您要达到的目标,则无法修复。例如,我是什么?是month_count吗?你说的rent_2(i - 0.6300)是什么意思,是不是表示你想在第i个月拿走rent_2价值的63%?
  • 我建议您仔细手动单步执行您的代码——也就是说,想想每一行发生了什么。例如if i = 1:3 做了什么,rent_2(i-0.5040) 会返回什么?通过一个简单的示例检查命令行,以确保您认为正在发生的事情正在发生。 (另请阅读uk.mathworks.com/help/matlab/matlab_prog/…
  • 尝试重新组织您的问题并添加更多详细信息。我也是相对较新的人,但我发现问题的最佳格式是简短描述您正在尝试做什么、代码的相关部分、它应该做什么以及它正在做什么不是你想要什么。此外,如果它与本网站上的其他问题相近,请链接到它们并解释您的问题有何不同。祝你好运!
  • 您好,感谢您的反馈。基本上,代码试图评估:(1)累计收到的租金金额:y = month_count *rent_1;另一部分 (rent_2(i - 0.6300)) 评估了经过一定的月数(在本例中是 4 个月,而不是 3 或 5 个月),收到的租金金额是“rent_2”乘以 (4-0.6300)。第一个“if”语句试图遍历第 1 个月到第 3 个月,应用完全相同的百分比进行扣除。 3 之后,百分比变化到 9 及以后。这应该被绘制出来,但只有一个 i (i=1) 的值并忽略 i = 2:10

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


【解决方案1】:

我仍在弄清楚您到底想做什么,所以我将给您一些提示,让您的代码正常运行。一旦您让它正常运行,请更新您的问题,我们会尽力帮助您。

你的 if 语句应该有逻辑或:

如果 a == b | a == c | a == d

你的 for 循环需要知道它在循环什么变量:

对于 n = 1:10 %,这将评估一个循环 10 次,从 1 到 10 的每个值一次

当你索引一个数组时,你的索引需要是一个正整数:

b = [4, 3, 2, 1];
a = b(2); % 这会将 a 设置为 3,因为 3 是 b 中的第二个条目
a = b(1.5); % 这将导致错误,因为 1.5 没有条目

尝试修复这些问题,然后编辑您的问题,然后我们可以为您提供更多帮助。

更新:

这是一个很好的 matlab 绘图参考资料 (http://www.mathworks.com/help/matlab/ref/plot.html)

在这种情况下,您的两条线都应该具有相同的 x 轴(月),并且由于您希望 b 中的所有数据都被绘制成图表,因此不需要为此目的编制索引。

【讨论】:

  • 我对含糊不清表示歉意。所以... 1. 应该从 1:10 开始循环,首先循环 1:3,应用第一个方程 (b(1,i)=rent_2*(i-0.5040);) 所以 b(1,1)= 1560 * .496。 b(1,2)= 1560 * .496。 b(1,3)= 1560 * .496。 2. 当这个循环 1:3 结束时,它应该继续下一个 elsif 语句,因为达到了 i=4。然后 i=5,以此类推。 3. 这应该同时构建一个数组 (1,10)。这些是图中的“y”值。
  • 你已经写了一行代码作为 b(1,i)=rent_2*(i-0.5040);和 b(1,i)=rent_2(i-0.5040);您的意思是 (i-0.5040) 作为索引还是要相乘的值?
  • 它是一个乘数:rent_2 * (i-0.5040)(仅适用于 i=1:3),因为“0.5040”的百分比不同,持续时间更长。
  • 你需要一个循环来围绕你的 if 语句来增加 i。并且您需要将乘法符号添加到您的语句中,以修复它们被视为索引。尝试修复这些问题,然后使用新代码更新您的问题。那我可以帮你画图。
  • for i = 1:10 if i == 1 |我 == 2 | i == 3 b(1,i)=rent_2 * (i-0.5040); elseif i == 4 b(1,i)=rent_2*(i-0.6300); elseif i == 5 b(1,i)=rent_2*(i-0.7565); elseif i == 6 b(1,i)=rent_2*(i-0.8825); elseif i == 7 b(1,i)=rent_2*(i-1.0085); elseif i == 8 b(1,i)=rent_2*(i-1.1345);否则 b(1,i)=rent_2*(i-1.2605);结束结束
【解决方案2】:

绝对没有理由在这里搞乱循环和 if 语句。

就像你这样做:

y = month_count * rent_1;

您可以将b 作为rent_2 乘以修饰符向量。简化示例 - 如果这些数字是通过其他公式计算的,最好使用这些公式而不是手动输入,但无论哪种方式:

m = [0.504 0.504 0.504 0.63 0.7565]; % values from your loop/ifs
d = 1:5 - m; %months minus the discount values
rent = rent_2.*d;

【讨论】:

  • 这个方案确实更好,谢谢。看起来我过于复杂并忽略了更多“matlabby”(换句话说,更多矩阵)的思考。只是对上面的一个小调整:c = [1:5] rent= rent_2.*c;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2015-07-24
相关资源
最近更新 更多