循环遍历数据集直到特定点 - 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
.
我已经 运行 进行了一项实验,其中一台机器对桥梁施加力直到它断裂。我需要循环遍历整个数据集并计算韧性,直到达到临界点 (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
.