我知道社区中也有类似的问题,但是我没有找到答案来理解我的问题。
我正在编写代码以对向量进行排序,而无需使用sort
函数。但是MATLAB给出了一个错误消息:
索引超出了数组元素的数量(6); min = q(s);
这是我的代码:
q = [3, 1, -1, 4, 2, 0 ] %is my vector to order
qRiserva = 0; % is a variable to temporarily keep the element of q(s)
s = 1; % is an index for outer 'for cycle'
min = q(s);
max = q(1);
i = 1; % is an index for deeper 'for cycle'
for s = s :length(q)
for i = s: length(q)
if q(i) <= min
qRiserva = q(s)
min = q(i)
q(s) = min
q(i) = qRiserva
end
end
s = s+1;
min = q(s);
end
我把min
等于索引为q
的向量s
的元素,所以我不明白为什么MATLAB给我这个错误。
答案 0 :(得分:1)
要排序,您想遍历除最后一个之外的所有元素,以便可以将这些元素与之后的所有元素进行比较。更改您的代码,如下所示:
q = [3, 1, -1, 4, 2, 0];
disp(q)
min = q(1);
for s = 1:length(q)-1
for i = s+1:length(q)
if q(i) <= min
qRiserva = q(s);
min = q(i);
q(s) = min;
q(i) = qRiserva;
end
end
s = s+1;
min = q(s);
end
disp(q)
因此,外循环遍历除最后一个元素之外的所有元素,而内循环遍历其余元素。原始代码循环了s:length(q)
,这意味着在某个时刻i==s
,因此将一个元素与其自身进行了比较,并对其进行了交换。因此,我们在这里循环i=s+1:length(q)
。
但是您也不需要min
:
function so
q = [3, 1, -1, 4, 2, 0];
disp(q)
for s = 1:length(q)-1
for i = s+1:length(q)
if q(i) <= q(s)
qRiserva = q(s);
q(s) = q(i);
q(i) = qRiserva;
end
end
end
disp(q)
最后,MATLAB有一个巧妙的技巧可以交换数组中的两个元素:
function so
q = [3, 1, -1, 4, 2, 0];
disp(q)
for s = 1:length(q)-1
for i = s+1:length(q)
if q(i) <= q(s)
q([s,i]) = q([i,s]); % swap
end
end
end
disp(q)
答案 1 :(得分:0)
s == length(q)== 6
,您应停止内部
循环s = 6+1 = 7
,当然还有
由于q(7)
的长度为6
只需在内循环之后添加一个break
q = [3, 1, -1, 4, 2, 0 ] %is my vector to order
qRiserva = 0; % is a variable to temporarily keep the element of q(s)
s = 1; % is an index for outer 'for cycle'
min = q(s);
max = q(1);
i = 1; % is an index for deeper 'for cycle'
for s = s :length(q)
for i = s: length(q)
if q(i) <= min
qRiserva = q(s)
min = q(i)
q(s) = min
q(i) = qRiserva
end
end
if s == length(q)
break;
end
s = s+1;
min = q(s);
end
答案 2 :(得分:0)
s = s+1;
,因为它已经使每次循环迭代都递增。min = q(s);
需要移动到循环的顶部,这样您就不需要在循环之前使用min = q(s);
。实际上不需要min = q(s)
,您可以直接使用q(s)
,它更易于理解。s = 1;
和s = s :length(q)
可以简化为s = 1 :length(q)
qRiserva
(或作为Cris Luengo's answer,可以使用q([s,i]) = q([i,s]);
)进行交换s+1
:i = (s+1): length(q)
开始,而firs循环可以以length(q)
:s = 1 :(length(q)-1)
结尾,这避免了将元素与其自身进行比较。min
和max
作为变量,它们是内置函数,您需要重新定义它们。代码:
q = [3, 1, -1, 4, 2, 0 ] %is my vector to order
for s = 1 :(length(q)-1)
for i = (s+1): length(q)
if q(i) <= q(s)
qRiserva = q(s);
q(s) = q(i);
q(i) = qRiserva;
end
end
end
关于代码的另外一些注意事项: 代替