如果缺失值(或零),Matlab填充前一个值

时间:2011-09-08 13:13:02

标签: matlab interpolation

我有一个包含时间序列的向量,其中包含不同的值和一些设置为零的缺失值:

X=[0,0,2,0,5,0,0,0,4,0];

我想创建一个新的向量,其中缺少值(零)由前一个值填充(如果存在),以便我得到一个新的向量,如下所示:

Z=[0,0,2,2,5,5,5,5,4,4];

我一直在浏览Matlab的帮助和这样的论坛,以找到一个整洁而合适的功能,可以通过一行解决方案或类似解决方案,但我没有这样做。我可以通过以下几个不同的步骤解决问题,但我猜想必须有更好更容易的解决方案吗?

目前的解决方案:

X=[0,0,2,0,5,0,0,0,4,0];
ix=logical(X);
Y = X(ix);
ixc=cumsum(ix);
Z=[zeros(1,sum(~logical(ixc))) Y(ixc(logical(ixc)))];

这就是诀窍,但对于一个简单的问题来说,它似乎是一个过于复杂的解决方案,所以任何人都可以帮助我找到更好的问题吗?感谢。

3 个答案:

答案 0 :(得分:5)

这是一个使用cumsum的更简单的版本:

X=[0,0,2,0,5,0,0,0,4,0];

%# find the entries where X is different from zero
id = find(X); 

%# If we want to run cumsum on X directly, we'd 
%# have the problem that the non-zero entry to the left
%# be added to subsequent non-zero entries. Thus, 
%# subtract the non-zero entries from their neighbor 
%# to the right 
X(id(2:end)) = X(id(2:end)) - X(id(1:end-1));

%# run cumsum to fill in values from the left
Y = cumsum(X)

Y =
     0     0     2     2     5     5     5     5     4     4

答案 1 :(得分:2)

这是我写的一些东西。这样做了吗?

% INPUT: the array you would like to populate
% OUTPUT: the populated array

function popArray = populate(array)

popArray = array;

% Loops through all the array elements and if it equals zero, replaces it
% with the previous element
%
% Since there is no element before the first to potentially populate it, this
% starts with the second element.
for ii = 2:length(popArray)
    if array(ii) == 0;
        popArray(ii)= popArray(ii-1);
    end
end

disp(popArray);

答案 2 :(得分:1)

让我建议另一个矢量化解决方案(虽然我更喜欢@Jonas更好的那个):

X = [0 0 2 0 5 0 0 0 4 0]

id = find(X);
X(id(1):end) = cell2mat( arrayfun(@(a,b)a(ones(1,b)), ...
    X(id), [diff(id) numel(X)-id(end)+1], 'UniformOutput',false) )