结果可能会产生误导。当您将两个空矩阵相乘时,生成的矩阵不会立即“分配”和“初始化”,而是会推迟到您第一次使用它时(有点像惰性计算)。
当索引超出范围以增长变量时,情况也是如此,在数字数组的情况下,该变量将用零填充所有缺失的条目(我将在后面讨论非数字的情况)。当然,以这种方式生长矩阵不会覆盖现有元素。
因此,虽然看起来更快,但是您只是在延迟分配时间,直到您真正开始使用矩阵。最后,您将拥有与开始时一样的分配时间。
与其他几种选择相比,展示此行为的示例:
N = 1000;
clear z
tic, z = zeros(N,N); toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
tic, z = zeros(N,0)*zeros(0,N); toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
tic, z(N,N) = 0; toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
tic, z = full(spalloc(N,N,0)); toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
tic, z(1:N,1:N) = 0; toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
val = 0;
tic, z = val(ones(N)); toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
clear z
tic, z = repmat(0, [N N]); toc
tic, z = z + 1; toc
assert(isequal(z,ones(N)))
结果显示,