如果我有以下形式的非连续数据集:
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
答案 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)