用零填充非连续数据-MATLAB

用零填充非连续数据-MATLAB,matlab,Matlab,如果我有一个非连续数据集,其形式如下: x y 7500 1.4 7501 1.45 7502 1.34 7510 1.67 7511 1.54 7512 1.89 用零填充所有中间x值的最快方法是什么?或在范围(即指定范围7490-7515)之间执行此操作,输出为: x y 7490 1.4 7491 0 7492 0 7493 0 7494 0 7495 0 7496 0 7497 0 7498 0 749

如果我有一个非连续数据集,其形式如下:

 x      y
7500   1.4
7501   1.45
7502   1.34
7510   1.67
7511   1.54
7512   1.89
用零填充所有中间x值的最快方法是什么?或在范围(即指定范围7490-7515)之间执行此操作,输出为:

 x      y
7490   1.4
7491   0
7492   0
7493   0
7494   0
7495   0
7496   0
7497   0
7498   0
7499   0
7500   1.4
7501   1.45
7502   1.34
7503   0
7504   0
7505   0
7506   0
7507   0
7508   0
7509   0
7510   1.67
7511   1.54
7512   1.89
7513   0
7514   0
7515   0

用零初始化它,然后将非零数据点分配给它

x2 = [7490:7515]';  % #'
y2 = zeros(size(x2));
[tf,ix] = ismember(x,x2);
y2(ix(tf)) = y(tf);
如果您知道所有
x
都存在于
x2
中,则可以跳过
(tf)
子集。如果所有的
x
值都是整数>=
x2(1)
,您可以通过执行索引移位优化昂贵的
ismember()
,如下所示

[lo,hi] = deal(7490, 7515);
x2 = [lo:hi]';  % #'
y2 = zeros(size(x2));
ix = x - lo + 1;
y2(ix) = y;

这应该是非常有效的,因为它使用了一个对
zero
的轻量级函数调用,这在本例中是必需的,并且使用了另一个对
numel
的轻量级调用。代码的其余部分都是关于矩阵索引的。这是密码-

%// Define range
range1 = 7490:7515

%// Setup output array and initialize the first column with range values
out = [range1.' zeros(numel(range1),1)]  %//'

%// Put A(:,2) values into the second column of output array indexed by the
%// offsets decided by the first column of A w.r.t. the starting range value
out( A(:,1)-range1(1)+1 , 2) = A(:,2) 
请注意,它假定
A
作为输入
非连续数据集


如果你想做一点实验,你可以用a来做这样的事情-

range1 = 7490:7515

clear out
out(numel(range1),2) = 0
out(:,1) = range1
out( A(:,1)-range1(1)+1 , 2) = A(:,2)