我有一个关于在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
?
每当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的情况下,这些不同的变量指标到一个不存在的阵列,这就要求“填充东西洞”,使之成为有效的,一致的阵列。
这是否把事情说清楚?
当定义a(1:2:5)
它创建一个大小5载体(零值),并选择奇数索引(其中存在3)细胞。 1:-4:-7
创建三个值(不是5个)。 最后的选择了三个单元填充有3个值从到来的数据1:-4:-7