MATLAB中冒号运算的组合
我有一个关于MATLAB中的冒号运算符和向量展开的问题。我的问题是理解下面这行代码是如何展开的,以便能够将其用于其他序列。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)会返回一个五个元素的向量,其位置为零。(零值),并选择奇数索引(
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
。第一个表达式创建五个元素,第二个表达式创建三个元素,当三个元素组合在一起时,这三个元素打印在vectora
中的奇数空格/元素上。感谢您的帮助,您是否有关于在哪里查找有关我的问题的更多信息的建议?当我搜索web时,我在形成。感谢您的支持!如果您认为它解决了您的问题,请接受作为答案。1:2:5实际上创建了3个值,如果您单独在MATLAB命令行中写入,诀窍是如果您使用它为向量建立索引,就像在(1:2:5)的情况下一样,它可以创建5个元素并选择其中3个。