使用零填充非连续数据 - MATLAB

时间:2015-04-30 10:05:33

标签: 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
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

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

这应该非常有效,因为它使用一个对zeros的轻量级函数调用,这在这种情况下是必需的,而另一个轻量级调用numel。其余的代码都是matrix-indexing。这是代码 -

%// 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为输入non-continuous dataset

如果你想进行一些实验,你可以使用hacky pre-allocation scheme来做这样的事情 -

range1 = 7490:7515

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