结合MATLAB中的冒号操作

时间:2012-08-24 07:54:57

标签: matlab syntax vectorization slice colon

我有一个关于冒号运算符和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

2 个答案:

答案 0 :(得分:1)

当您定义a(1:2:5)时,它会创建一个5号向量(零值),并选择奇数索引(其中3个存在)单元格。 1:-4:-7创建三个值(而不是五个)。最后,您选择的三个单元格将填充来自1:-4:-7

的3个值的数据

答案 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案例中,这些不同的变量是不存在的数组的索引,这需要“用某些东西填充空洞”以使其成为有效的,一致的数组。

这是否清楚了?