如何在MATLAB中创建具有模式[1 2 5 6 9 10 13 14 17 18….]的向量?

如何在MATLAB中创建具有模式[1 2 5 6 9 10 13 14 17 18….]的向量?,matlab,vector,Matlab,Vector,假设我们要创建一个具有以下模式的向量: [1 3 5 7 9] 我们可以很容易地写 1:2:10 但是,如果我想要这种模式,我应该写什么呢 [1 2 5 6 9 10 13 14 17 18 ....] [0.000221 0.000000 -0.000420 0.000000 0.000570 0.000000 -0.000418 0.000000 0.000000 0.017647 0.000000 -0.002033

假设我们要创建一个具有以下模式的向量:

[1   3   5   7   9] 
我们可以很容易地写

1:2:10
但是,如果我想要这种模式,我应该写什么呢

[1 2 5 6 9 10 13 14 17 18 ....]
   [0.000221   0.000000  -0.000420   0.000000   0.000570   0.000000  -0.000418   0.000000
   0.000000   0.017647   0.000000  -0.002033   0.000000   0.017248   0.000000  -0.001855]
?

这背后的想法是我有一个长列矩阵:

[-0.41416   0.37756  -3.39666  -0.42352   0.83481  -0.66782  -0.75471   0.54008  -0.60284 -1.43141  -1.10128  -0.18244]
我想把它变成:

[-0.41416   0.37756 0 0  -3.39666  -0.42352 0 0   0.83481  -0.66782 0 0  -0.75471   0.54008 0 0 -0.60284 -1.43141 0 0 -1.10128  -0.18244 0 0]
对于每2个值,我要添加两个零

如果我只想在每个值之间有0,那么我就是这样解决的

l = length(g);
nu = rows(g);
G = zeros(nu, l*nu);
for i = 1:nu
  G(i, i:nu:l*nu-1+i) = g(i, 1:l);
end
g = G; 
该代码将改变这种模式

   [1.4392e-04   5.6149e-07   1.4572e-04  -1.1104e-05   1.4720e-04  -3.3176e-05   1.4836e-04
   2.4174e-04   6.5988e-06   2.7917e-04   5.3787e-06   3.1924e-04   1.0706e-06   3.6204e-04]
按照这种模式:

[1 2 5 6 9 10 13 14 17 18 ....]
   [0.000221   0.000000  -0.000420   0.000000   0.000570   0.000000  -0.000418   0.000000
   0.000000   0.017647   0.000000  -0.002033   0.000000   0.017248   0.000000  -0.001855]
您可以查看

[1 2 5 6 9 10 13 14 17 18 ....]
金额如下:

  [0 1 0 1 0 1 0 1 ...] + [1 1 5 5 9 9 13 13 ...]
= [0 1 0 1 0 1 0 1 ...] + [0 0 4 4 8 8 12 12 ...] + [1 1 1 1 1 1 1 1 ...]
= [0 1 0 1 0 1 0 1 ...] + 4*[0 0 1 1 2 2 3 3 ...] + [1 1 1 1 1 1 1 1 ...]
这些块中的每一块都应该更容易创建:

[0 1 0 1 0 1 0 1 ...] = mod(0:1:9, 2)
[0 0 1 1 2 2 3 3 ...] = floor(0.5 * (0:1:9))
[1 1 1 1 1 1 1 1 ...] = ones(1, 10)
综合起来:

>> mod(0:1:9, 2) + 4*floor(0.5*(0:1:9)) + ones(1,10)
ans =
    1    2    5    6    9   10   13   14   17   18
但是关于问题的第二部分,如果你的目标是在每两个元素后面插入两个零,那么有一个更简单的方法来解决这个问题。首先,将长数组重塑为2×2(n/2)矩阵:

现在插入两行零:

>> z = [y; zeros(2, 6)]
z 
  -0.41416  -3.39666   0.83481  -0.75471  -0.60284  -1.10128
   0.37756  -0.42352  -0.66782   0.54008  -1.43141  -0.18244
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000   0.00000   0.00000
然后将其重塑为一维阵列:

>> w = reshape(z, 1, 24)
w =
 Columns 1 through 7:
  -0.41416   0.37756   0.00000   0.00000  -3.39666  -0.42352   0.00000
 Columns 8 through 14:
   0.00000   0.83481  -0.66782   0.00000   0.00000  -0.75471   0.54008
 Columns 15 through 21:
   0.00000   0.00000  -0.60284  -1.43141   0.00000   0.00000  -1.10128
 Columns 22 through 24:
  -0.18244   0.00000   0.00000

你不需要任何数学知识;您确实可以利用MATLAB的MAT部分,如下所示:

  • 生成所需数组的奇数索引元素数组
  • 向其添加1以获得偶数索引元素的数组
  • 将两行垂直连接,从而获得一个包含两行的矩阵
  • 按列对矩阵进行矢量化
  • 如果你真的需要一排的话,把它调换一下
n=100;
x=1:4:n;
x=[x;x+1];
x=x(:)';
这将在输出向量中生成偶数个元素。如果需要奇数,请使用相同的代码和相应的
n
,并将最后一行更改为:

x=x(1:end-1)';

试图解决任意长度的问题的答案,而不依赖于可除以2或4的长度。

在处理此类任务时,我喜欢用简短的文本或数学方式描述模式,这通常会导致一些我可以实现的东西。此处“从1到n的所有数字,其余数为1或2除以4”

它允许您设置最高值
n
。如果您想设置列表中的元素数,我将使用以下代码:

>> m = 7;

>> [1:m]*2-(mod([1:m],2)==0)-1

ans =

    1     2     5     6     9    10    13
这背后的想法是,你的模式类似于2 4 6 8,递减1,然后每个奇数位置递减1。这可能更适合您的索引操作:

x=rand(7,1);
m=numel(x);
pattern=[1:m]*2-(mod([1:m],2)==0)-1;
y(pattern)=x;
返回:

y =

    0.9572    0.4854         0         0    0.8003    0.1419         0         0    0.4218    0.9157         0         0    0.7922

可以堆叠两行向量(第二行向量等于一加第一行向量),然后重塑其形状:

a=[1:4:17]; >>b=重塑(顶点(a,a+1),1,[]) b= 1 2 5 6 9 10 13 14 17 18 同样的想法延伸到你的第二个“背后的原因”示例:

>c=[-0.41416 0.37756-3.39666-0.42352 0.83481-0.66782-0.75471 0.54008-0.60284-1.43141-1.10128-0.18244];
>>d=重塑(c,2,[]);
>>e=重塑(顶点(d,0*d),1,[])
e=
第1列至第12列
-0.4142    0.3776         0         0   -3.3967   -0.4235         0         0    0.8348   -0.6678         0         0
第13列至第24列
-0.7547    0.5401         0         0   -0.6028   -1.4314         0         0   -1.1013   -0.1824         0         0

我将演示如何完成您真正想要完成的任务,而不是回答标题中的问题:在每两个数据值后插入两个零

要做到这一点,我们重塑(这基本上是免费的,没有数据被复制)向量,使其具有2xN个元素。现在,我们添加两行零,并再次将矩阵重塑为列向量:

M=[-0.41416 0.37756-3.39666-0.42352 0.83481-0.66782-0.75471 0.54008-0.60284-1.43141-1.10128-0.18244];
M=重塑(M,2,[]);
M=[M;零(大小(M))];
M=重塑(M,[],1);
M=M(1:end-2);%去掉最后两个零,这是我们不想要的
当然,这只适用于大小均匀的阵列。对于奇数大小的数组,我们先添加一个零,然后再删除它:

M=[-0.41416 0.37756-3.39666-0.42352 0.83481-0.66782-0.75471 0.54008-0.60284-1.43141-1.10128];
M=重塑([M;0],2,[]);%注意,我们在这里加一个零
M=[M;零(大小(M))];
M=重塑(M,[],1);
M=M(1:end-3);%去掉最后三个零,这是我们不想要的