八度 - 创建一个由零分隔的1到10之间的奇数序列

时间:2014-09-20 13:30:45

标签: matrix octave matrix-multiplication

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

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 ...]),我仍然需要更短的方法。

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用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的附加索引,然后在表达式的右侧,我必须添加一个零。

答案 1 :(得分:1)

或创建

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

答案 2 :(得分:0)

这是我的建议:

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 ... ]
[ ...       ...      ... ]