我有一个关于 MATLAB 中的冒号运算符和向量扩展的问题。我的问题是了解以下代码行如何扩展,以便能够将其用于其他序列。MATLAB代码行是:
a(1:2:5) = 1:-4:-7
注意a
扩展之前没有定义。这将返回向量
a = 1 0 3 0 -7
我知道冒号运算符是如何工作的{start}:{step}:{stop}
,我的问题是理解如何以及为什么组合a(1:2:5)
和1:-4:-7
返回一个由五个元素组成的向量,位置2
和5
?
我有一个关于 MATLAB 中的冒号运算符和向量扩展的问题。我的问题是了解以下代码行如何扩展,以便能够将其用于其他序列。MATLAB代码行是:
a(1:2:5) = 1:-4:-7
注意a
扩展之前没有定义。这将返回向量
a = 1 0 3 0 -7
我知道冒号运算符是如何工作的{start}:{step}:{stop}
,我的问题是理解如何以及为什么组合a(1:2:5)
和1:-4:-7
返回一个由五个元素组成的向量,位置2
和5
?
当您定义时a(1:2:5)
,它会创建一个大小为 5 的向量(零值),并选择奇数索引(其中 3 个存在)单元格。1:-4:-7
创建三个值(不是五个)。最后,您选择的三个单元格填充了来自 3 个值的数据1:-4:-7
每当 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 5]
用 values填充元素[1 -3 -7]
。为初始化变量a
(即[2 4]
)而跳过的索引将自动初始化为零。
如果你熟悉 Python,这有点像将多个值分配给多个变量的语法
x,y = 1,2
但是在您的 Matlab 案例中,这些不同的变量是不存在数组的索引,这需要“用某些东西填充孔”以使其成为有效、一致的数组。
这是否说明问题?