我有一个关于冒号运算符和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
的组合如何以及为什么返回五个元素的向量,其中零位为{ {1}}和2
?
答案 0 :(得分:1)
当您定义a(1:2:5)
时,它会创建一个5号向量(零值),并选择奇数索引(其中3个存在)单元格。 1:-4:-7
创建三个值(而不是五个)。最后,您选择的三个单元格将填充来自1:-4:-7
答案 1 :(得分:1)
每当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]
填充元素[1 -3 -7]
。为了初始化变量a
(即[2 4]
)而跳过的索引将自动初始化为零。
如果你熟悉Python,它有点像为多个变量分配多个值的语法
x,y = 1,2
但是在你的Matlab案例中,这些不同的变量是不存在的数组的索引,这需要“用某些东西填充空洞”以使其成为有效的,一致的数组。
这是否清楚了?