用nan替换第一个(x个)非纳米值

时间:2012-06-10 09:01:26

标签: performance matlab matrix replace nan

假设我有以下矩阵: a =

 2   NaN   NaN
 4   NaN     3
 3     7     9
 5    12     5
 8    10     8
12     5    10

我需要用Nan替换每列中的前x个非Nan值。

如果要替换的值的数量是x = 3,则新矩阵应为:

b =

NaN   NaN   NaN

NaN   NaN   NaN

NaN   NaN   NaN

5     NaN   NaN

8     NaN   8

12    5     10

任何想法如何做到这一点?

提前致谢。

4 个答案:

答案 0 :(得分:2)

循环遍历列,然后循环遍历每列的成员,用Nan替换前3个非NaN数字:

for c = 1:size (a,2)
  col = a (:,c);
  replaced = 0;
  for r = 1:size (col)
    if (~isnan (col (r)))
      a (r,c) = Nan;
      replaced = replaced + 1
      if (replaced == 3)
        break;
      end
    end
  end
end

我认为应该这样做

答案 1 :(得分:2)

这是一个矢量化解决方案。首先将a的顶部(将被新NaN替换的部分)放入aTopMatrix。然后将a的下半部分变为aLowMatrix。然后,使用逻辑地址,根据aLowMatrix中预先存在的NaN值,将NaN的值替换为aTopMatrix。最后,创建一个NaN数组,其大小为x x size(a,2),并将其与aLowMatrix垂直连接,以便在b中获得所需的结果矩阵。

%定义示例数据:

a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ]
x = 3

%这是代码:

aTopMatrix = a(1:x, 1:end);
aLowMatrix = a(x+1:end, 1:end);
aLowMatrix(isnan(aTopMatrix)) = NaN;
b = [ ones(x, size(a,2))*NaN; aLowMatrix ];

答案 2 :(得分:2)

这是另一个矢量化代码:

%# given the data
a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ]
x = 3

%# replace with NaNs
sz = size(a);
d = [ones(1,sz(2)) ; diff(~isnan(a))];
rIdx = arrayfun(@(k) find(d(:,k),1,'last'), 1:sz(2));
ind = bsxfun(@plus, sub2ind(sz, rIdx, 1:sz(2)), (0:x-1)');
a(ind(:)) = NaN;

首先我们检查非纳米元素,然后我们diff跨行的结果。我们在每列中找到最后1的位置,转换为线性索引并为每个列添加偏移量x。最后,我们使用计算的索引替换为NaN s。

答案 3 :(得分:-1)

class TestNan
{
    public static void main(String[] args)
    {
        double[][] mat = new double[6][3];
        //initialize the matrix here
        for(int i = 0; i<3; i++)
        {
            int x = 3; // no. of numbers to be replaced
            for(int j = 0; j<6; j++)
            {
                if(x == 0)
                    break;
                Double d = Double.valueOf(mat[i][j]);
                if(!d.isNaN())
                {
                    d = Double.NaN;
                    x--;
                }
            }
        }
        //Print your matrix here
    }   
}

试试这个,如果您遇到任何问题请告诉我!!