【问题标题】:Why does matlab warn to preallocate a variable which is getting reset every loop?为什么 matlab 会警告预分配每个循环都会重置的变量?
【发布时间】:2026-01-03 04:00:01
【问题描述】:

我的程序中有一个单元格变量,Matlab 警告要预先分配它。简单的代码形式是这样的:

for i = 1:2
    a = [];
    a = [a,{'abc'}];
end

首先我想知道为什么应该预先分配a,因为它在每个循环中都会被重置。其次,我不知道如何预先分配它。当我尝试这样做时,Matlab 给了我另一个警告,说“变量似乎是预分配的,但这里不建议预分配”。

我在循环之前使用了这段代码:

a = cell(1,2);

更具体:

for i = 1:2
    a = [];
    if condition1
        a = {'abc'};
    end
    if condition2
        a = [a,{'def'}];
    end
    b = [{'string'},a];
end

如果条件不成立,我希望 b 成为 1x1 元胞数组,因此我需要在每个循环中将 a 重置为空 var。

更新:

李的回答暗示了我找到了一种方法,但仍然不知道为什么。使用a = [a(:),{'def'}]; 而不是a = [a,{'def'}]; 解决了警告。

【问题讨论】:

    标签: matlab cell-array pre-allocation


    【解决方案1】:

    您将a 设置为一个新变量,因此之前的a = cell(1,2) 从未使用过,这使得matlab 提出了警告。

    你可以使用 sth like

    a = cell(1,2);
    for ii = 1:2
        a{ii} = 'abc';
    end
    

    或者如果你真的想改变a的大小,

    for ii = 1:2
        a = {'a1'};
        a = [a(:); {'abc'}];
    end
    

    【讨论】:

    • 感谢您的回复。正如我在问题中添加的那样,我需要在每个循环开始时使用“a”来清空。所以我不能将它设置为 {'a1'}。我还能做什么?再次感谢。
    • 只需将a = [] 替换为a = {}