【问题标题】:simple MATLAB exercise that I can't solve (basic level loops involved)我无法解决的简单 MATLAB 练习(涉及基本级别​​循环)
【发布时间】:2014-04-03 23:30:48
【问题描述】:

我有这个问题,我想在 matlab 中解决。所以,有一个假想的工厂生产缝合线,只有在盒子上的封条符合某些参数的情况下才会发货: 1.密封必须在150-170摄氏度之间 2. 密封压力必须在 60-70 psi 之间 3. 停留时间必须在 2.0 到 2.5 秒之间(如果你不知道这意味着什么,请不要担心)

所以练习提供了一个包含 5 列和 34 行数据的矩阵。每一行对应一个不同的缝合密封,每一列都有关于该密封的数据。唯一重要的列是第 3 4 和 5 列,因为它们对应于温度 (3) 压力 (4) 和停留时间 (5)。如果有关印章的数据不符合上述参数,则第 1 列包含框号,第 2 列包含被拒绝的星期几(1、2、3、4 或 5)。 (这个矩阵在名为 suture.mat 的文件中 [稍后将相关])。

这是我想要做的:显示 (1-6) 的值,然后移动到 7 和 8

1) 因温度而被拒收的箱子百分比, 2) 因压力而拒收的百分比,以及 3) 由于停留时间而拒绝的百分比。 注意:如果一个特定的盒子因为一个以上的原因被拒绝,它应该被计入所有 适用的总数。 4)被拒绝的盒子总数(记住一个被拒绝的盒子应该只出现 总共出现一次,但可能出现在多个拒绝类别中。) 5) 5 天内每天创建的盒子总数 6) 五天中每一天的每个拒绝类别的箱子数

7) 创建一个二维条形图,显示五天中每一天的被拒绝盒子的总数 8) 创建一个 3-D 条形图,显示五天中每一天的每个类别中的总框数

到目前为止,我只能使用一些带有基本 if 语句的 for 循环正确显示 1-4 的值。我不能做剩下的事情,我需要一些指导或实际代码来完成 5-8。感谢您的宝贵时间。

P.S- 这是我所拥有的产生 1-4 的值(不确定是否正确)。

clc 清除

load suture.mat;
Temps = suture(1:end,3);
sumT=0;
TBad= Temps(1:end)<150|Temps(1:end)>170 ; %function that sets parameters for which batch gets rejected based on temperature
for iT= 1:1:length(TBad)
    if(TBad(iT)==1)
    sumT=sumT+1;
    end 
end

disp('The percent batches rejected due to temperature')
PercentRejT=(sumT/iT)*100

Pres=suture(1:end,4);
sumP=0;
PBad= Pres(1:end)<60|Pres(1:end)>70 ;%function that sets parameters for which batch gets rejected based on pressure
for iP= 1:1:length(PBad)
    if(PBad(iP)== 1)
    sumP=sumP+1;
    end 
end
 disp('The percent batches rejected due to pressure')
PercentRejP=(sumP/iP)*100

 DwelT=suture(1:end,5);
sumDt=0;
DtBad= DwelT(1:end)<2|DwelT(1:end)>2.5 ;%function that sets parameters for which batch gets rejected based on Dwell time
for iDt= 1:1:length(DtBad)
    if(DtBad(iDt)== 1)
    sumDt=sumDt+1;
    end 
end
disp('The percent batches rejected due to dwell time')
PercentRejDt=(sumDt/iDt)*100

sutsBad= PBad((1:end))== 1|TBad((1:end))==1|DtBad((1:end))==1;
sumTot=0;
 for iTot= 1:1:length(sutsBad)
    if((sutsBad(iTot))== 1)
    sumTot=sumTot+1;
    end 
 end
 disp('The total amount of batches rejected:')
disp(sumTot)

【问题讨论】:

    标签: matlab if-statement for-loop matrix while-loop


    【解决方案1】:

    对于 # 的 5 和 6,您的矩阵的日期列现在很有用。您可以继续使用逻辑数组来挑选每天的信息。假设你想知道星期一的统计数据:monday = sutures(:,2) == 1; 会给你一个逻辑数组。然后sutures(monday,3) 将给出周一因温度而被拒绝的盒子(如果周一有 6 个盒子因温度而被拒绝,那么size(sutures(monday,3)) = [6 1];玩弄一下逻辑索引;这非常值得了解)。因此,您正在做的是获取“day”列表示是星期一的位置的索引,并使用它们来获取其他列的相同行中的值。然后您可以根据需要继续挑选/组合数据。

    我从未制作过 3-D 条形图,但如果您查看 bar 的文档,您可以找到有关 2-D 图的信息,谷歌搜索“matlab 3d bar graph”应该会带您了解其余的方法。祝你好运!如果有什么不完全清楚的,请告诉我。

    您似乎有了一个良好的开端,已经在使用逻辑数组。不过,您可以稍微简化一些事情(这里的所有内容都集中在代码样式上)。您称为TBadPBadDtBad 的逻辑数组的值都为0 或1。因此,与其循环累加sumTsumPsumDt,您可以得到与sumT = sum(TBad); 相同的答案。只有 34 行不会有太大区别,但如果数据集更大,您的循环确实会减慢您的速度。

    也许这是您做出的样式选择,但您也不需要'(1:end)' 索引 - 您可以使用PBad = Pres&lt;60|Pres&gt;70(对于数组,Pres=suture(:,4))。对于sutsBad...==1 也应该是不必要的; sutsBad = TBad | PBad | DtBad 应该可以工作,因为它们已经是逻辑数组。

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2014-07-01
      • 2017-08-18
      • 1970-01-01
      • 2021-03-10
      • 2017-07-30
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多