矩阵预分配 - MATLAB

时间:2015-05-29 10:41:47

标签: performance matlab

我有以下代码:

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停止警告我预分配?

2 个答案:

答案 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);