在MATLAB中的向量中的非零元素之间插入零个变量

Inserting variable number of zeros between non-zero elements in a vector in MATLAB

我有一个像这样的向量:

1
a = [1,2,3,4,5,6...,n]

,我想获得一个新的向量,如下所示:

1
a_new = [1,0,0,2,0,0,3,0,0,4,0,0,5,0,0,6,...,0,0,n]

其中在非零元素之间插入固定数量的零(在上面的示例中为2)。如果选择zero_p=3,则新矢量将为:

1
a_new = [1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,...,0,0,0,n]

我该怎么做?


我可以想到几种方法:

克罗内克产品

克罗内克(Kronecker)产品非常适合此用途。
在Matlab中,kron是您要查找的内容:

1
2
3
4
5
6
a = 1:4;
a = kron(a, [1 0 0])

ans =

    1     0     0     2     0     0     3     0     0     4     0     0

或广义上的

1
2
3
4
5
6
7
8
a = 1:4;
zero_p = 3;
b = [1 zeros(1,zero_p-1)];
a = kron(a, b)

ans =

    1     0     0     2     0     0     3     0     0     4     0     0

如果要使其以非零元素结尾,则必须执行另一步骤:

1
a = a(1:end-zero_p);

或者,如果您喜欢单线,则可以像这样完成整个操作:

1
2
3
4
5
6
7
a = 1:4;
zero_p = 3;
a = [kron(a(1:end-1), [1 zeros(1,zero_p-1)]), a(end)]

ans =

   1     0     0     2     0     0     3     0     0     4

零填充

可能是最简单的方法和最佳的性能:

1
2
3
4
 a = 1:4;
 zero_p = 3;
 a = [a; zeros(zero_p, size(a, 2))];
 a = a(1:end-zero_p);

矩阵乘法

也很简单,易读且性能出色,尽管在此特定情况以外的许多情况下它可能会过大:

1
2
3
4
a = 1:4;
b = [1; zeros(zero_p, 1)];
a = b*a;
a = a(1:end-zero_p);


尝试一下:

1
2
3
zero_p=3;
a_new=zeros(1, (zero_p+1)*length(a)-zero_p);
a_new(1:(zero_p+1):end)=a;

(未经测试,但有望工作。)


x = [1 2 3 4 5];
上采样(x,3)

o / p:1 0 0 2 0 0 3 0 0 4 0 0 5 0 0

干杯!!