如何解决索引超过矩阵维度的问题 - MATLAB.



这个系统是使用两个坐标点生成距离。工作表 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

您的错误是用航点的 id 引用航点矩阵的行号。您真正想做的是在航点列中找到分别与开始或结束中的航点 ID 匹配的相应行。

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

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

请注意,我还将您的变量名End更改为to,因为end是 MATLAB 中的一个特殊词,我建议不要在变量名中使用。仅仅通过大小写来区分名字可能是错误的。

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


编辑 1:

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

我在评论中对你所做的是尝试完全完成这个过程。逐步减少数据,并查看错误发生的位置。通常,这是您应该能够自己做的事情。

那么,让我们举个例子:

您注意到语句中存在问题

deg2km(distance)

这里只有两件事可能会出错。要么你输入错误,要么deg2km有问题。由于deg2km是 MATLAB 提供的函数,因此错误极不可能(尽管并非不可能(在该函数内。因此,我们必须了解您的输入存在什么问题。

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

  • 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) 中的条目上。只要您需要,请执行此操作,直到您了解导致问题的原因。然后我们应该尝试了解导致该输入的原因。之后,解决问题通常只需几秒钟。

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

最新更新