3

我有一个关于 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

4

2 回答 2

1

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

于 2012-08-24T08:06:08.220 回答
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]用 values填充元素[1 -3 -7]。为初始化变量a(即[2 4])而跳过的索引将自动初始化为零。

如果你熟悉 Python,这有点像将多个值分配给多个变量的语法

x,y = 1,2

但是在您的 Matlab 案例中,这些不同的变量是不存在数组的索引,这需要“用某些东西填充孔”以使其成为有效、一致的数组。

这是否说明问题?

于 2012-08-24T09:44:07.873 回答