在MATLAB中向非零元素间插入可变数量的零元素

3

我有一个向量:

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

我想要获得一个像这样的新向量:

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,则新向量将变为:

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]

我该如何做到这一点?

等等。


请参考这个非常相似的问题:http://stackoverflow.com/questions/10272288/upsampling-in-matlab - mtrw
非常感谢!解决这个问题真的很简单...非常感谢! - 8bit_Biker
3个回答

5

试试这个:

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

(未经测试,但应该能够正常工作。)

5

我可以想到几种方法:

Kronecker乘积

Kronecker乘积非常适用于此。在Matlab中,您需要使用kron函数:

a = 1:4;
a = kron(a, [1 0 0])

ans = 

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

或者,更加普遍地说,
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     

如果您想以非零元素结束,您需要执行一个额外的步骤:

a = a(1:end-zero_p);

或者,如果您喜欢一行代码,整个过程可以这样完成:
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

零填充

可能是最简单且具有最佳性能的方法:

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

矩阵乘法

虽然在许多场景中可能过于复杂,但它非常简单易懂且性能出色,尤其是在特定情况下:

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

这很好,但是在 OP 的问题中,新向量以非零元素结尾。 - Chris

0

x = [1 2 3 4 5]; upsample(x,3)

输出:1 0 0 2 0 0 3 0 0 4 0 0 5 0 0

祝好!


请格式化您的代码(http://stackoverflow.com/help/formatting)。此外,如果您发布需要工具箱(在本例中为信号处理工具箱)的答案,则应指出。 - nkjt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接