0

该系统使用两个坐标点来生成距离。表 1 显示每个航点的坐标,表 2 显示航点的连接。

因此我需要产生距离,但我一直遇到这个问题;“??? 索引超出矩阵维度。” 我怎么解决这个问题。

以下是我的编码和存储在excel中的数据。

编码

M = xlsread('Region11.xlsx',1);  
N = xlsread('Region11.xlsx',2);
Start = N(:,1);
End = N(:,2);
distance = distance([M(Start,3),M(Start,4)],[M(End,3),M(End,4)]);
a= deg2km(distance);
xlswrite('Region11.xlsx',a, 2,'C2');

区域 11 - 表 1

No. Waypoints Latitude Longitude
1   11001   1.37983 103.84421
2   11002   1.3808  103.84406
3   11003   1.38186 103.84375
4   11004   1.38376 103.84301
5   11005   1.3838  103.84293
6   11006   1.38361 103.84153
7   11007   1.38354 103.84118
8   11008   1.38342 103.84088
9   11009   1.38308 103.84022
10  11010   1.38301 103.8402
11  11011   1.37973 103.84191
12  11012   1.37964 103.84201
13  11013   1.37963 103.84206
14  11014   1.37983 103.8441
15  11015   1.38003 103.84408
16  11016   1.38003 103.84408
17  11017   1.37998 103.84411
18  11018   1.37982 103.84403
19  11019   1.37984 103.84371
20  11020   1.37991 103.84373
21  11021   1.37994 103.8439
22  11022   1.38001 103.84328
23  11023   1.37993 103.84315
24  11024   1.37977 103.8431
25  11025   1.37981 103.84308
26  11026   1.37978 103.84269
27  11027   1.37972 103.84266
28  11028   1.37948 103.84253
29  11029   1.37955 103.84232
30  11030   1.37965 103.84197
31  11031   1.37981 103.84188
32  11032   1.37987 103.84196
33  11033   1.38004 103.84175
34  11034   1.3801  103.84187
35  11035   1.38018 103.8417
36  11036   1.38024 103.84179
37  11037   1.38008 103.84207
38  11038   1.38021 103.84201
39  11039   1.37997 103.84213
40  11040   1.38013 103.8429
41  11041   1.38021 103.84289
42  11042   1.38022 103.84289
43  11043   1.38028 103.84367
44  11044   1.38028 103.84367
45  11045   1.38026 103.84363
46  11046   1.38052 103.844
47  11047   1.38053 103.84398
48  11048   1.38059 103.84407
49  11049   1.38099 103.84394
50  11050   1.381   103.84391
51  11051   1.3811  103.84388
52  11052   1.38108 103.84393
53  11053   1.38122 103.84387
54  11054   1.38127 103.84392
55  11055   1.38127 103.84384
56  11056   1.3816  103.8437
57  11057   1.38164 103.84374
58  11058   1.38169 103.84381
59  11059   1.38158 103.84354
60  11060   1.38157 103.84349
61  11061   1.38135 103.84289
62  11062   1.38133 103.84288
63  11063   1.38125 103.84286
64  11064   1.38124 103.84285
65  11065   1.38083 103.84286
66  11066   1.38083 103.84286
67  11067   1.38099 103.84203
68  11068   1.381   103.84203
69  11069   1.3817  103.841
70  11070   1.3817  103.84099
71  11071   1.38166 103.84094
72  11072   1.38199 103.84076
73  11073   1.38199 103.84076
74  11074   1.3824  103.84053
75  11075   1.3824  103.84053
76  11076   1.38242 103.84053
77  11077   1.38242 103.84053
78  11078   1.38247 103.84046
79  11079   1.38292 103.84028
80  11080   1.38291 103.84043
81  11081   1.38291 103.84039
82  11082   1.38295 103.84072
83  11083   1.38291 103.8407
84  11084   1.38306 103.84051
85  11085   1.38323 103.84038
86  11086   1.38338 103.84067
87  11087   1.38329 103.84069
88  11088   1.38331 103.84091
89  11089   1.38347 103.84079
90  560621  1.383063 103.840593
91  560623  1.38268 103.840794
92  560625  1.382201 103.841111
93  560627  1.381864 103.84128
94  560633  1.381204 103.84217
95  560634  1.381582 103.843162
96  560636  1.381192 103.843284
97  560635  1.380788 103.842238
98  560637  1.38034 103.842361
99  560638  1.380486 103.843468
100 560639  1.379957 103.8424
101 560640  1.380024 103.843584

区域 11 - 表 2

Start   End    Distance
11001   11002
11002   11003
11003   11004
11004   11005
11005   11006
11006   11007
11007   11008
11008   11009
11009   11010
11010   11011
11011   11012
11012   11013
11013   11014
11014   11001
11001   11015
11015   11048
11048   11002
11002   11053
11053   11058
11058   11003
11008   11089
11089   11086
11086   11085
11085   11009
11010   11079
11079   11078
11078   11074
11074   11072
11072   11071
11072   11035
11035   11033
11031   11030
11030   11011
11030   11012
11013   11029
11029   11027
11027   11024
11024   11019
11019   11018
11018   11014
11018   11017
11017   11016
11016   11015
11017   11021
11019   11020
11022   11023
11023   11024
11023   11025
11025   11040
11022   11042
11042   11041
11041   11040
11026   11027
11028   11029
11031   11032
11033   11034
11035   11036
11035   11037
11037   11038
11038   11039
11041   11065
11065   11066
11065   11063
11063   11064
11063   11061
11061   11062
11061   11060
11060   11059
11068   11067
11057   11056
11056   11058
11056   11054
11055   11053
11054   11049
11049   11050
11049   11051
11051   11052
11052   11046
11046   11047
11046   11048
11069   11070
11071   11070
11070   11072
11072   11073
11072   11074
11074   11075
11075   11076
11076   11077
11076   11078
11078   11081
11080   11081
11079   11081
11085   11084
11086   11087
11089   11088
11082   11083
560621  11087
11084   560621
11080   560621
11082   560621
11083   560623
560623  11077
560625  11073
560627  11069
560633  11068
560633  11062
560634  11059
560634  11057
560636  11064
560636  11050
560636  11055
560635  11067
560635  11066
560637  11038
560637  11036
560637  11040
560638  11042
560638  11043
560638  11047
560639  11039
560639  11032
560639  11026
560639  11025
560640  11022
560640  11045
560640  11020
560640  11021
560640  560640
4

1 回答 1

0

您使用航点的 id 引用航点矩阵的行号的错误。您真正想要做的是分别在与 start 或 end 中的航点 id 匹配的航点列中找到相应的行。

您可以使用ismember-function 执行此操作:

[~, start] = ismember(N(:,1), M(:, 2));
[~, to]   = ismember(N(:,2), M(:, 2));
distance  = distance(M(start,3:4), M(to,3:4));

请注意,我还将您的变量名更改Endto,这end是 MATLAB 中的一个特殊词,我建议不要在变量名中使用它。仅按大小写区分名称可能是错误的。

最后,您可以使用 - 运算符以更紧凑的方式在距离函数中编写您的选择:,就像我在上面所做的那样。


编辑1:

我觉得有必要就通常的错误跟踪策略提供一些建议。尤其是在 MATLAB 等基于向量的语言中,您可以在一行中编写相当复杂的语句。如果此行包含错误,则您必须找到一种方法来解决该问题的根源,然后才能解决它。

我在评论中和你一起做的是试图完全按照这个过程。逐步减少数据,看看错误发生在哪里。通常,这是你应该能够自己做的事情。

那么,让我们来看一个例子:

您注意到语句中有问题

deg2km(distance)

这里只有两件事可能出错。要么输入错误,要么deg2km出错。与deg2kmMATLAB 提供的函数一样,错误极不可能(尽管并非不可能)出现在该函数中。因此,我们必须了解您的输入存在什么问题。

现在我看到了一些可能导致问题的选项:

  • 变量格式的数据类型distance完全错误
  • 你需要不止一个论据
  • 只有distance变量的几个条目有问题

要确定正确的选项之一,您必须系统地尝试它们。第一次尝试:

deg2km(0.000981522767956357)

那个有效。因此,我们不会错过进一步的论点。

deg2km([0.000981; 08.9421])

那个也可以。我们现在知道我们可以传递一个列向量到deg2km没有进一步的问题。现在只剩下两件事:它是distance导致麻烦的特定条目或格式distance不是列向量。

让我们尝试一下:如果我理解正确,我们有distance(1) == 0.000981522767956357. 我们知道这个数字是 的有效输入deg2km,我们可以尝试以下操作:

deg2km(distance(1))

那样有用吗?如果是的话,我们再看看

deg2km(distance(1:2))

那样有用吗?distance(1:2)如果不是,我们应该检查和之间的系统差异deg2km([0.000981; 08.9421])是什么 - 那是可能导致错误的事情。但是,如果它有效,让我们做

deg2km(distance(1:20))

这个如何?如果这不起作用,请查看distance(3:20). 看起来很奇怪的东西?您也可以尝试进一步缩小问题范围:

deg2km(distance(1:10))

如果可行,我们就知道问题出在distance(11:20). 只要您需要,就这样做,直到您了解导致问题的原因。然后我们应该尝试了解导致该输入的原因。之后,解决问题通常只需几秒钟。

这种策略几乎可以应用于您可能遇到的所有问题。它还可以帮助您更好地理解您的第一个问题。

于 2012-05-17T07:27:25.093 回答