【问题标题】:Matlab create vectorized sequenceMatlab 创建向量化序列
【发布时间】:2014-03-03 10:30:45
【问题描述】:

我想构造一个接受输入 n 并给出向量的函数

[n n-1 n-2 ... n-n, n-1 n-2 ... n-n, ..., n-n]

//Example 
input :  n=3 
output : [3 2 1 0 2 1 0 1 0 0]

我知道如何使用循环来做到这一点,但我正在寻找一种聪明的方法来在 MATLAB 中做到这一点

【问题讨论】:

  • 我不明白序列最后是如何从 n-n ... n-n 进行的
  • @Wajahat 我已经添加了一些逗号,希望能够澄清它。

标签: matlab vectorization


【解决方案1】:

您可以使用repmat重复矩阵几次,然后通过tril只选择三角形部分。像这样:

n=3;
x=repmat(n:-1:0,1,n+1);
result=x(tril(ones(n+1))>0)

或者在一行中:

n=3;
getfield(repmat(n:-1:0,1,n+1),{reshape(tril(ones(n+1))>0,1,(n+1)^2)})

这个函数的结果就是想要的输出:

result =

     3     2     1     0     2     1     0     1     0     0

【讨论】:

  • 我认为你需要 (n+1)^2 代替 16
  • 是的,我粘贴草稿太快了;)
  • 不错的解决方案,我想仍然可以通过将最后一行替换为:result=x(tril(true(n+1)))
【解决方案2】:

由于您还没有得到任何答案,这里有一个方法:

N = 3;
x = repmat(N:-1:0,1,N+1)-cumsum(repmat([1 zeros(1,N)],1,N+1))+1
x = x(x>=0)
x =
    3   2   1   0   2   1   0   1   0   0

【讨论】:

  • 否则:x = mod((N+1)^2-1:-1:0,4) - ceil((1:((N+1)^2))/(N+1)) + 1 非常相似
  • 也许是口味问题,但我会在中间行中选择这样的东西:repmat(N:-1:0,N+1,1)'-repmat(1:N+1,N+1,1)+1
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多