【问题标题】:Octave - Creating a sequence of odd numbers between 1 and 10 separated by zerosOctave - 创建 1 到 10 之间用零分隔的奇数序列
【发布时间】:2014-09-20 13:30:45
【问题描述】:

在没有显式输入值的情况下,并且只使用一行代码(没有分号!),我正在尝试编写一个创建以下数字系列的代码,并将其输出到屏幕:

a= 1 0 3 0 5 0 7 0 9 0

这是我实现这一目标的最佳尝试,

a= [1:10].*[1 0 1 0 1 0 1 0 1 0]

这会产生并显示正确的结果,但我仍然需要更短的方法,因为我正在输入第二个矩阵的值 ([1 0 1 0 1 0...])。

有什么想法吗?谢谢。

【问题讨论】:

    标签: matrix octave matrix-multiplication


    【解决方案1】:

    您可以使用repmat[1,0] 数组复制5 次,总共有10 个元素。因此,尝试这样做:

    a = [1:10].*repmat([1 0], 1, 5)
    
    a =
    
     1     0     3     0     5     0     7     0     9     0
    

    或者,您可以使用纯索引来做到这一点:

    a([1:2:9 10]) = [1:2:9 0]
    
    a =
    
     1     0     3     0     5     0     7     0     9     0
    

    第二段代码的诀窍在于,当您以这种方式动态分配变量时,MATLAB / Octave 会用零填充您没有索引的任何缺失值。因此,我们将位置 1、3、5、7、9 中的值定义为 1、3、5、7、9。但是,这样做本身将创建一个 9 元素数组。要制作这 10 个元素,我必须提供一个额外的索引 10,然后在表达式的右侧,我必须添加一个零。

    【讨论】:

      【解决方案2】:

      或者创建一个

      a = 1:10;
      

      然后将偶数位置的元素设置为0

      a(2:2:10) = 0
      a =
      
         1   0   3   0   5   0   7   0   9   0
      

      编辑(感谢 rayryeng 指出规则!)

      还有一个班轮:

      a = (1:10) .* (mod(1:10, 2) != 0)
      a =
      
         1   0   3   0   5   0   7   0   9   0
      

      【讨论】:

      • 酷!这也有效。 +1。但是,我认为 OP 想要一个命令。从技术上讲,这将是两个,但仍然可以很好地使用数组的偶数位置。
      • @rayryeng 哦,我忽略了“只有一行代码”部分。现在我明白为什么你的回答看起来如此聪明!
      • 不用担心 :) 为了可读性,我会选择你的代码而不是我的。单行约束有点烦人,但这是我唯一能想到的,除了使用repmat。无论如何我还是给了你一个 +1,因为我没有考虑将偶数条目归零!
      • 谢谢!我使用偶数属性添加了一个单行。
      【解决方案3】:

      这是我的建议:

      kron( [1:2:10] , [1 0])

      我更喜欢它的原因是因为您可以在该行的单个位置修改上限(10)。

      如果您是kron 的新手,它的作用是接受两个矩阵AB,并返回一个大矩阵,如下所示:

      [ A(1,1)*B  A(1,2)*B ... ]
      [ A(2,1)*B  A(2,2)*B ... ]
      [ ...       ...      ... ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 2018-08-03
        相关资源
        最近更新 更多