【问题标题】:Combination of colon-operations in MATLABMATLAB中冒号操作的组合
【发布时间】:2012-08-24 07:54:57
【问题描述】:

我有一个关于 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 syntax vectorization slice colon


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

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

    x,y = 1,2
    

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

    这是否使事情变得清晰?

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 好的,所以我必须小心比较a(1:2:5)1:-4:-7。第一个表达式创建 5 个元素,第二个表达式创建 3 个元素,当组合这三个元素时,将打印在向量 a 中的奇数空格/元素上。感谢您的帮助,您对在哪里可以找到有关我的问题的更多信息有什么建议吗?当我在网上搜索时,我找不到相关信息。感谢您的支持!
      • 如果您认为它可以解决您的问题,请接受作为答案。如果您仅在 MATLAB 命令行中写入,则 1:2:5 实际上会创建 3 个值,诀窍是如果您使用它来索引向量,就像在 a(1:2:5) 的情况下一样,它就像创建 5 个元素一样并选择其中的 3 个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多