用零填充非连续数据-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)