我需要按行将前一个元素替换为矩阵中的零(或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)))';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句