【发布时间】:2019-01-14 22:07:00
【问题描述】:
我试图在不使用 Matlab 中的排序命令的情况下对列表中的数字进行排序。我找不到我的代码有什么问题。
这是我尝试过的:
clc
A= [1 2 4 0 0 8]
B=[]
for i=1:length(A)
indx=find(A==min(A))
for j=1:length(indx)
B(i)=A(indx(j))
end
A(indx(1):indx(length(indx)))=[]
B
end
结果是:
B =
0 1 2 4 8
indx =
1×0 empty double row vector
Index exceeds the number of array elements (0).
B 的期望值为
B =
0 0 1 2 4 8
【问题讨论】:
-
你的错误是什么?该错误告诉您有关您在循环中执行的迭代次数的什么信息?为什么会这样? (提示:每次迭代你从
A中删除了多少元素?) -
这里发生的情况是,在第二个中,B(1)=A(index(1)) 和 B(1)= A(index(2))。我想要的是 B(2)= A(index(2))
-
不是您的错误的来源,但这是什么?
A(indx(1):indx(length(indx)))?这需要第一个和最后一个匹配之间的所有元素,而不仅仅是匹配。为什么不只是A(indx)?此外,indx(length(indx))与indx(end)相同(但更慢)。 -
@fyec,你说得对,这是问题之一。为了解决这个问题,您需要为
j的每次迭代增加B(i)。所以也许B(i+j-1) = A(indx(j))?但这不是给你错误信息的原因。 -
错误来自@CrisLuengo 提到的删除多个匹配项的行,但仍迭代
A的原始长度。您只是用完了要匹配的元素,当indx == []时,indx(1)不存在。要解决这个问题,我会将您的for i...循环更改为while ~isempty(A),只要A有元素需要排序,它就会继续循环。