MATLAB中冒号运算的组合

MATLAB中冒号运算的组合,matlab,syntax,vectorization,slice,colon,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组合如何以及为什么组合a(1:2:5)和a(1: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
组合如何以及为什么组合
a(1:2:5)
a(1:2:5)
会返回一个五个元素的向量,其位置为零。

(零值),并选择奇数索引(其中3个存在)单元格。
1:-4:-7
创建三个值(而不是五个值)。最后,您选择的三个单元格将填充来自
1:-4:-7

的3个值的数据。每当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);
这比类似的东西要好得多

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-7]填充元素
[1-3-5]
。为初始化变量
a
(即
[2 4]
)而跳过的索引将自动初始化为零

如果您熟悉Python,它有点像为多个变量分配多个值的语法

x,y = 1,2
但是在你的Matlab例子中,这些不同的变量是一个不存在的数组的索引,这需要“用一些东西填充漏洞”使它成为一个有效的、一致的数组


这说明问题了吗?

好的,所以我必须小心比较
a(1:2:5)
1:-4:-7
。第一个表达式创建五个元素,第二个表达式创建三个元素,当三个元素组合在一起时,这三个元素打印在vector
a
中的奇数空格/元素上。感谢您的帮助,您是否有关于在哪里查找有关我的问题的更多信息的建议?当我搜索web时,我在形成。感谢您的支持!如果您认为它解决了您的问题,请接受作为答案。1:2:5实际上创建了3个值,如果您单独在MATLAB命令行中写入,诀窍是如果您使用它为向量建立索引,就像在(1:2:5)的情况下一样,它可以创建5个元素并选择其中3个。