matlab – 以完全矢量化的方式将行中的零(或NAN)与前一个元素逐行或逐列地替换

我需要用行中的前一个元素替换矩阵中的零(或NaN),所以基本上我需要这个Matrix X

[0,1,2,2,1,0;  
5,6,3,0,0,2;  
0,0,1,1,0,1]  

变成这样:

[0,1,2,2,1,1;  
5,6,3,3,3,2;  
0,0,1,1,1,1],  

请注意,如果第一行元素为零,它将保持这样.

我知道这已经以矢量化方式解决了单个行或列向量,这是最好的方法之一:

id = find(X);         
X(id(2:end)) = diff(X(id));       
Y = cumsum(X)  

问题是Matlab / Octave中矩阵的索引是连续的并且按列递增,因此它适用于单个行或列,但是不能应用相同的精确概念但需要使用多行修改因为每个原始/列开始新鲜,必须被视为独立.我已经尽力了,谷歌搜索了整个谷歌,但没有找到出路.如果我在循环中应用相同的想法它会变得太慢,因为我的矩阵至少包含3000行.有人可以帮我解决这个问题吗?

最佳答案 Eitan的修改版本的答案是为了避免跨行传播值:

Y = X'; %'
tf = Y > 0;
tf(1,:) = true;
idx = find(tf);
Y(idx(2:end)) = diff(Y(idx));
Y = reshape(cumsum(Y(:)),fliplr(size(X)))';
点赞