我有以下代码:
clear; clc;
a = [1,2,3,4,3];
b = zeros(1,5);
for i = 1:4
for j = i+1:5
if a(i) == a(j)
b = [b,i];
end
end
end
b
b
是一个由双for
循环内的连接元素产生的数组。即使我声明了数组b = zeros(1,5)
,MATLAB
也警告我b
需要预先分配。我应该如何修改代码,以便MATLAB
停止警告我预分配?
答案 0 :(得分:2)
问题是连接步骤b = [b, i]
将追加 i
添加到b
,因此您只需将数字放在零点矩阵之后。您想要的是分配b
的特定元素,例如b(???)=i
,???
需要按顺序排列,以便最简单地保留一个单独的计数器变量。
clear; clc;
a = [1,2,3,4,3];
b = zeros(1,5);
counter = 1;
for i = 1:4
for j = i+1:5
if a(i) == a(j)
b(counter) = i;
counter = counter + 1;
end
end
end
b
请注意,您需要在此示例中过度分配b
,因为您实际上并不知道它最终会有多少元素,如果您的示例真的很简单,那么我会可能只是忽略了这种情况下的警告,除非您发现代码很慢
答案 1 :(得分:2)
尝试以下方法。您已正确预分配数组,但在预分配后,您再次尝试通过语句b = [b,i]动态扩展它:这将做什么是在5个零之后连接新元素。
clear; clc;
a = [1,2,3,4,3];
b = zeros(1,5);
b_idx=0;
for i = 1:4
for j = i+1:5
if a(i) == a(j)
b_idx = b_idx+1;
b(b_idx) = i;
end
end
end
disp(b);