每当 Matlab 检测到您正在查找某个元素时outside矩阵/数组的当前边界,它将自动用零填充缺失的元素:
>> clear b; b(10) = 5
b =
0 0 0 0 0 0 0 0 0 5
这个功能既很有用, and 非常危险。它很有用,因为可以非常容易地进行事实声明,例如您自己的案例。您可以通过发出类似的命令来创建一整套定制类
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
The 1:2:5
将扩展到数组[1 3 5]
,以及1:-4:-7
将给出值[1 -3 -7]
。由于变量a
尚不存在,Matlab 将创建一个新的并填充元素[1 3 5]
与价值观[1 -3 -7]
。为了初始化变量而跳过的索引a
(即,[2 4]
)然后将自动初始化为零。
如果你熟悉Python,它有点像为多个变量分配多个值的语法
x,y = 1,2
但在您的 Matlab 案例中,这些不同的变量是不存在数组的索引,这需要“用某些东西填充孔”以使其成为有效、一致的数组。
这是否让事情变得清楚了?