循环遍历数据集直到特定点 - Matlab

Loop through data set until specific point - Matlab

我已经 运行 进行了一项实验,其中一台机器对桥梁施加力直到它断裂。我需要循环遍历整个数据集并计算韧性,直到达到临界点 (fdValue1)。 韧性是通过将我的负载与距离曲线下的所有矩形相加来计算的。 (基本上是积分) 但是,我一直没能找到一个合理的方法,我的当前循环是一个无限循环,我不确定为什么。

  %Initializing variables
  bridge1Data = xlsread('Bridge1Data.xlsx', 'A2:C2971');
  bridge2Data = xlsread('Bridge2Data.xlsx', 'A2:C1440');

  bridge1Load = bridge1Data(:, 2);
  bridge2Load = bridge2Data(:, 2);

  bridge1Dist = bridge1Data(:, 3);
  bridge2Dist = bridge2Data(:, 3);

  [row1, col1] = size(bridge1Dist);
  [row2, col2] = size(bridge2Dist);

  bridge1Disp = zeros(row1, col1);
  bridge2Disp = zeros(row2, col2);

  fdValue1 = 0.000407350000000029;

  &Main code
  %Displacement
  for k = 2:length(bridge1Dist)
      bridge1Disp(k-1, 1) = bridge1Dist(k, 1) - bridge1Dist(k-1, 1);
  end

  %Max Load Bridge 1
  maxLoad1 = 0;
  for n = 1:length(bridge1Load)
      for k = 1
          if bridge1Load(n, k) > maxLoad1
              maxLoad1 = bridge1Load(n, k);
          end
      end
  end

  %Cycle through data till failure, change proj data
  totalRect1 = 0;
  for j = 2:length(bridge1Disp) 
      while bridge1Disp(j, 1) ~= fdValue1
          rectangle = (bridge1Disp(j, 1) - bridge1Disp(j-1, 1))*...
                      ((bridge1Load(j, 1) + bridge1Load(j-1, 1))/2);
          totalRect1 = totalRect1 + rectangle;
      end
  end

基本上,我为机器在桥上向下推的负载和距离制作了一个数组,分配了一个 'Failure Distance' 值 (fdValue),用于确定我们何时停止计算韧性。然后我计算位移,计算最大负载。然后通过变量 'rectangle',计算每个矩形并将它们全部加在 'totalRect1' 中,并使用它通过求曲线下的面积来计算韧性。有谁能明白为什么循环是无限循环? 谢谢

在代码部分

%Cycle through data till failure, change proj data
totalRect1 = 0;
for j = 2:length(bridge1Disp)
   while bridge1Disp(j, 1) ~= fdValue1
      rectangle = (bridge1Disp(j, 1) - bridge1Disp(j-1, 1))*...
         ((bridge1Load(j, 1) + bridge1Load(j-1, 1))/2);
      totalRect1 = totalRect1 + rectangle;
   end
end

while循环的测试条件为

bridge1Disp(j, 1) ~= fdValue1

然而,在 while 循环中,bridge1Disp(j, 1) 的值不会改变,因此如果在 while 循环的第一次迭代中 bridge1Disp(j, 1)~= fdValue1,则循环将永无止境。

希望这对您有所帮助。

条件 while bridge1Disp(j, 1) ~= fdValue1 的问题在于您需要检查 <= 而不是(不)相等,因为 double 数字几乎永远不会计算为相等,即使如果他们看起来是这样。要了解更多相关信息,您可以查看 here and also google for matlab double comparison。通常它与精度问题有关。

通常在检查双 相等性时 你应该使用类似 if abs(val-TARGET)<1E-4 的东西,并指定你愿意允许的一些公差。


无论如何,

您不需要为您尝试做的事情使用循环。我猜这来自一些 C 编程习惯,这在 MATLAB 中不是必需的。

第一个循环(Displacement),它计算每两个相邻元素之间的差异,可以用函数diff代替,如下所示:

bridge1Disp = diff(bridge1Dist);

第二个循环构造(Max Load Bridge 1),它检索 bridge1Load 的最大元素,可以用命令 max 替换为如下:

maxLoad1 = max(bridge1Load);

对于最后一个循环结构 (Cycle ...) 考虑我上面提到的函数,以及 find.