在MATLAB结肠操作的组合(Combination of colon-operations in

2019-09-21 14:05发布

我有一个关于在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返回矢量与在位置零五行25

Answer 1:

每当Matlab的检测你indecing到一个元件基体/阵列的当前范围之外时,会自动垫用零缺少的元素:

>> 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的情况下,这些不同的变量指标到一个不存在的阵列,这就要求“填充东西洞”,使之成为有效的,一致的阵列。

这是否把事情说清楚?



Answer 2:

当定义a(1:2:5)它创建一个大小5载体(零值),并选择奇数索引(其中存在3)细胞。 1:-4:-7创建三个值(不是5个)。 最后的选择了三个单元填充有3个值从到来的数据1:-4:-7



文章来源: Combination of colon-operations in MATLAB