每当 Matlab 检测到您在矩阵/数组的当前边界之外的元素 时,它会自动用零填充缺失的元素:
>> clear b; b(10) = 5
b =
0 0 0 0 0 0 0 0 0 5
此功能非常有用,也非常危险。它对事实声明非常有用,例如您自己的情况。您可以通过发出类似的东西来创建一系列定制类
myClassArray(500) = myClass(1, 2);
这比类似的东西要好得多
% cannot pre-allocate (zeros() or ones() give double/uint8/..., not myClass)
for ii = 1:499
myClassArray(ii) = myClass; % so, growing array
end
myClassArray(500) = myClass(1,2);
但是,越来越多的数组可能很难被发现:
a = zeros(10,1);
for ii = 1:10
a(ii+1) = rand;
end
这会使性能大幅下降。此外,当您将 Matlab 中的原型代码翻译成静态类型语言(如 C++)时,复制此代码将导致缓冲区溢出,从而导致段错误。
现在,回到你的案例:
clear a; a(1:2:5) = 1:-4:-7
1:2:5 将扩展为数组[1 3 5],1:-4:-7 将给出值[1 -3 -7]。由于变量a 尚不存在,Matlab 将创建一个新变量并用值[1 -3 -7] 填充元素[1 3 5]。为了初始化变量a(即[2 4])而跳过的索引将自动初始化为零。
如果你熟悉 Python,这有点像为多个变量分配多个值的语法
x,y = 1,2
但在您的 Matlab 案例中,这些不同的变量是不存在数组的索引,这需要“用某些东西填充孔”以使其成为有效、一致的数组。
这是否使事情变得清晰?