首页 > 解决方案 > 将 for 循环从 MATLAB 转换为 Python

问题描述

我试图将 MATLAB 代码转换为 Python,但没有得到适当的结果。MATLAB 的结果是正确的,但 Python 代码的结果是错误的。

我的 MATLAB 代码是:

xc =[27.6851 27.6573 27.6358 27.6499 27.6448 27.6435 27.6480 27.6418 27.6556  27.6506 27.6066 27.6004
   27.5988 27.5939 27.5892 27.5755 27.5774 27.5968 27.5907 27.5861 27.5776 27.5554 27.5509 27.5210 27.5094 
   27.5109 27.4952 27.4777 27.4617 27.4298 27.4275 27.4186 27.4338 27.4247 27.4132 27.4111 27.4014 27.3751
   27.3411 27.3276 27.3043 27.2914 27.2840 27.2216 27.1806 27.1619 27.1599 27.1727 27.1644 27.1724 27.1722 
   27.1741 27.1807 27.1814 27.1791 27.1720 27.1653 27.1621 27.1590 27.1598 27.1645 27.1587 27.1500 27.1573
   27.1635 27.1605 27.1503 27.1489 27.1509 27.1503 27.1454 27.1167 27.0813 27.0524 27.0040 26.9938 26.9731 
   26.9935 26.9870 26.9876 26.9887 26.9920 26.9851 26.9736 26.9906 27.0207 27.0270 27.0220 27.0224 27.0241 
   27.0213 27.0152 27.0182 27.0235 27.0431 27.0516 27.0493 27.0405 27.0424 27.0383 27.0353 27.0293 27.0288
   27.0333 27.0403 27.0421 27.0449 27.0723 27.1126 27.1903 27.2248 27.2522 27.2646 27.2721 27.2726 27.2959
   27.3411 27.3833 27.4242 27.4889 27.5974 27.6362 28.0603];
yc = [22.7222 22.7192 22.6895 22.6662 22.6459 22.6377 22.6498 22.6579 22.6530 22.6664 22.6903 22.6904
   22.7133 22.7365 22.7414 22.7678 22.7831 22.7956 22.8158 22.8497 22.8633 22.8916 22.9066 22.9493
   22.9893 23.0000 23.0118 23.0371 23.0545 23.0857 23.0978 23.1105 23.1083 23.1255 23.1350 23.1422
   23.1623 23.1828 23.2156 23.2344 23.2622 23.2705 23.2906 23.3335 23.4233 23.4887 23.5721 23.6112
   23.6368 23.6530 23.6813 23.7030 23.7298 23.7612 23.7900 23.8237 23.8459 23.8881 23.9266 23.9494
   23.9866 24.0173 24.0344 24.0827 24.1190 24.1501 24.1796 24.1883 24.1985 24.2336 24.3291 24.3946
   24.4475 24.4868 24.5159 24.5969 24.6645 24.7714 24.8320 24.8987 25.0400 25.1576 25.2470 25.3148
   25.4278 25.5148 25.5629 25.5927 25.6133 25.6391 25.6453 25.6630 25.6738 25.6874 25.7278 25.7371
   25.7590 25.7740 25.7956 25.8046 25.8755 25.8226 25.8929 25.8323 25.8631 25.7839 25.7516 25.7103
   25.7021 25.6988 25.7069 25.7092 25.7137 25.7180 25.7247 25.6927 25.7097 25.7337 25.7497 25.7821
    25.8509 25.9075 25.6166];

idx_start = [1,5,9,100,105,1];
idx_end = [5,9,100,105,123,123];
Length_idx=idx_end-idx_start+1;

for i=1:length(idx_start)
    if Length_idx(i)>=12 %Minimum number of points to calculate MSD
        for j=1:Length_idx(i)
            msd(j)=mean((xc(idx_start(i)+j:1:idx_end(i))-xc(idx_start(i):1:idx_end(i)-j)).^2 + (yc(idx_start(i)+j:1:idx_end(i))-yc(idx_start(i):1:idx_end(i)-j)).^2 );
        end
    end
end

msd

我试图将 MATLAB 代码转换为 Python。我的 Python 代码是:

import numpy as np

x = np.array([[27.685125],[27.657279],[27.635751],[27.649908],[27.64476 ],[27.643473],[27.648036],[27.641835],[27.655641],[27.65061 ],[27.606618],[27.600417],
              [27.598779],[27.593865],[27.589185],[27.575496],[27.577368],[27.59679 ],[27.590706],[27.586143],[27.577602],[27.555372],[27.550926],[27.520974], 
              [27.509391],[27.510912],[27.495234],[27.477684],[27.461655],[27.429831],[27.427491],[27.418599],[27.433809],[27.424683],[27.413217],[27.411111],
              [27.4014  ],[27.375075],[27.341145],[27.327573],[27.30429 ],[27.29142 ],[27.284049],[27.221571],[27.180621],[27.161901],[27.159912],[27.172665],
              [27.164358],[27.172431],[27.172197],[27.174069],[27.180738],[27.18144 ],[27.1791  ],[27.171963],[27.165294],[27.162135],[27.158976],[27.159795],
              [27.164475],[27.158742],[27.149967],[27.157338],[27.163539],[27.160497],[27.150318],[27.148914],[27.150903],[27.150318],[27.145404],[27.116739],
              [27.081288],[27.052389],[27.003951],[26.993772],[26.973063],[26.993538],[26.986986],[26.987571],[26.988741],[26.992017],[26.985114],[26.973648],
              [26.990613],[27.020682],[27.027   ],[27.021969],[27.022437],[27.024075],[27.021267],[27.015183],[27.018225],[27.02349 ],[27.043146],[27.05157 ],
              [27.049347],[27.040455],[27.042444],[27.038349],[27.035307],[27.02934 ],[27.028755],[27.033318],[27.040338],[27.042093],[27.044901],[27.072279],
              [27.112644],[27.190332],[27.224847],[27.252225],[27.264627],[27.272115],[27.272583],[27.295866],[27.341145],[27.383265],[27.424215],[27.488916],
              [27.597375],[27.636219],[28.060344]])

y = np.array([[22.722219],[22.719177],[22.689459],[22.666176],[22.645935],[22.637745],[22.649796],[22.657869],[22.652955],[22.66641 ],[22.690278],[22.690395],
              [22.713327],[22.736493],[22.741407],[22.767849],[22.783059],[22.795578],[22.815819],[22.849749],[22.863321],[22.891635],[22.906611],[22.949316],
              [22.98933 ],[22.999977],[23.011794],[23.037066],[23.054499],[23.085738],[23.097789],[23.110542],[23.108319],[23.125518],[23.134995],[23.142249],
              [23.162256],[23.182848],[23.215608],[23.234445],[23.262174],[23.270481],[23.290605],[23.333544],[23.423283],[23.488686],[23.572107],[23.611185],
              [23.636808],[23.652954],[23.681268],[23.70303 ],[23.729823],[23.761179],[23.789961],[23.823657],[23.845887],[23.888124],[23.926617],[23.949432],
              [23.986638],[24.017292],[24.034374],[24.082695],[24.118965],[24.150087],[24.179571],[24.188346],[24.198525],[24.233625],[24.329097],[24.394617],
              [24.447501],[24.486813],[24.515946],[24.59691 ],[24.664536],[24.771357],[24.831963],[24.898653],[25.039989],[25.157574],[25.246962],[25.314822],
              [25.427844],[25.514775],[25.562862],[25.592697],[25.613289],[25.639146],[25.645347],[25.663014],[25.673778],[25.68735 ],[25.727832],[25.737075],
              [25.758954],[25.774047],[25.795575],[25.804584],[25.875486],[25.822602],[25.892919],[25.832313],[25.863084],[25.783875],[25.751583],[25.710282],
              [25.702092],[25.698816],[25.706889],[25.709229],[25.713675],[25.718004],[25.724673],[25.692732],[25.709697],[25.733682],[25.749711],[25.78212 ],
              [25.850916],[25.907544],[25.616565]])

idx_start = np.array([1,5,9,100,105,1])
idx_end = np.array([5,9,100,105,123,123])
length_idx = idx_end - idx_start + 1

for i in range(0, len(idx_start)):
    msd = []
    if length_idx[i] >= 12 :
        for j in range(1, length_idx[i] + 1):
            t1 = np.power(x[idx_start[i] + j: idx_end[i] , :] -
                          x[idx_start[i]: idx_end[i] - j , :], 2)
            t2 = np.power(y[idx_start[i] + j: idx_end[i] , :] -
                          y[idx_start[i]: idx_end[i] - j , :], 2)
            msd.append(np.mean(t1 + t2, axis=0)[0])

my_formatted_list = [ '%.4f' % elem for elem in msd ]
print(my_formatted_list)

其中xy是形状 (123,1) 的列向量

预期输出为:

0.0045  0.0101  0.0195  0.0313  0.0457  0.0626
0.0820  0.1037  0.1279  0.1547  0.1843  0.2165
0.2510  0.2881  0.3269  0.3679  0.4110  0.4571
0.5054  0.5567  0.6098  0.6659  0.7240  0.7849
0.8483  0.9145  0.9835  1.0555  1.1301  1.2071
1.2871  1.3702  1.4570  1.5474  1.6413  1.7388
1.8401  1.9448  2.0513  2.1604  2.2724  2.3870
2.5028  2.6187  2.7348  2.8518  2.9672  3.0842
3.2018  3.3232  3.4471  3.5734  3.7012  3.8291
3.9595  4.0931  4.2304  4.3702  4.5125  4.6570
4.8028  4.9518  5.1040  5.2577  5.4142  5.5726
5.7326  5.8968  6.0646  6.2351  6.4043  6.5733
6.7430  6.9142  7.0873  7.2593  7.4274  7.5850
7.7358  7.8770  8.0065  8.1259  8.2378  8.3426
8.4342  8.5148  8.5897  8.6610  8.7312  8.7994
8.8684  8.9370  9.0059  9.0730  9.1317  9.1890
9.2402  9.2890  9.3325  9.3662  9.3730  9.3910
9.3818  9.3880  9.3741  9.3820  9.3972  9.4253
9.4538  9.4908  9.5201  9.5433  9.5653  9.5774
9.5797  9.6126  9.6359  9.6288  9.6105  9.5703
9.3530  8.5180     NaN

但我得到了这个:

['0.0045', '0.0102', '0.0196', '0.0315', '0.0460', '0.0631',
 '0.0826', '0.1046', '0.1289', '0.1560', '0.1859', '0.2184',
 '0.2533', '0.2907', '0.3298', '0.3712', '0.4148', '0.4613', 
 '0.5101', '0.5619', '0.6154', '0.6720', '0.7305', '0.7919', 
 '0.8560', '0.9228', '0.9923', '1.0650', '1.1401', '1.2180', 
 '1.2988', '1.3830', '1.4708', '1.5622', '1.6573', '1.7558', 
 '1.8581', '1.9636', '2.0714', '2.1814', '2.2948', '2.4108', 
 '2.5270', '2.6427', '2.7591', '2.8762', '2.9928', '3.1109', 
 '3.2302', '3.3529', '3.4784', '3.6063', '3.7356', '3.8649', 
 '3.9966', '4.1318', '4.2704', '4.4115', '4.5559', '4.7019', 
 '4.8495', '5.0009', '5.1545', '5.3101', '5.4686', '5.6290', 
 '5.7925', '5.9603', '6.1306', '6.2997', '6.4687', '6.6380', 
 '6.8089', '6.9816', '7.1532', '7.3241', '7.4885', '7.6452', 
 '7.7942', '7.9251', '8.0454', '8.1575', '8.2637', '8.3568', 
 '8.4395', '8.5151', '8.5871', '8.6570', '8.7247', '8.7936', 
 '8.8610', '8.9297', '8.9982', '9.0597', '9.1184', '9.1722', 
 '9.2206', '9.2653', '9.3070', '9.3208', '9.3411', '9.3363', 
 '9.3441', '9.3384', '9.3498', '9.3692', '9.4034', '9.4409', 
 '9.4806', '9.5217', '9.5574', '9.5851', '9.6120', '9.6265', 
 '9.6660', '9.7075', '9.7310', '9.7276', '9.6802', '9.4572', 
 '8.5573', 'nan', 'nan']

标签: pythonpython-3.xmatlabfor-loop

解决方案


推荐阅读