matlab - MATLAB 中冒号运算的组合

标签 matlab syntax vectorization slice

我有一个关于 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位置为零?

最佳答案

每当 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 中原型(prototype)化的代码转换为 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 案例中,这些不同的变量是不存在数组的索引,这需要“用某些东西填充孔”以使其成为有效、一致的数组。

这是否让事情变得清楚了?

关于matlab - MATLAB 中冒号运算的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105271/

相关文章:

mysql - 为什么这个 sql 查询不断向我显示语法错误

c++ - 创建重载运算符时出错

c++ - 矢量化:何时值得手动展开循环?

matlab - 不理解 Matlab 生成的绘图命令

matlab - 查找和删除监听器

syntax - 内省(introspection)模块/类/等的替代语法

optimization - Matlab:优化这个?

python - 使用 pandas 的字符串列表交叉引用多列的有效方法

c++ - 如何手动注册图像(图像注册)

string - 忽略\n(换行符)