1

次の行列があるとします: a =

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

各列の最初の x 個の非 Nan 値を Nan に置き換える必要があります。

置換する値の数が x = 3 の場合、新しい行列は次のようになります。

b =

NaN   NaN   NaN

NaN   NaN   NaN

NaN   NaN   NaN

5     NaN   NaN

8     NaN   8

12    5     10

これを行う方法はありますか?

前もって感謝します。

4

4 に答える 4

2

これはベクトル化されたソリューションです。まず、の上部(新しいsaに置き換えられる部分)をに入れます。次に、の下部を取得します。次に、論理アドレス指定を使用して、の既存の値に従っての値をsに置き換えます。最後に、xのサイズの配列を作成し、それを垂直方向に連結して、で目的の結果行列を取得します。NaNaTopMatrixaaLowMatrixaLowMatrixNaNNaNaTopMatrixNaNxsize(a,2)aLowMatrixb

%サンプルデータを定義します。

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 ];
于 2012-06-10T12:06:06.583 に答える
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;

最初に非 nan 要素をチェックし、次にdiff行全体の結果をチェックします。1各列の最後の位置を見つけ、線形インデックスに変換し、xそれぞれにオフセットを追加します。最後に、計算されたインデックスを使用して s に置き換えNaNます。

于 2012-06-10T13:54:23.913 に答える
2

列をループしてから、各列のメンバーをループし、最初の 3 つの非 NaN 数値を 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

そうすべきだと思う

于 2012-06-10T09:12:15.390 に答える
-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
    }   
}

これを試してみてください。問題が発生した場合はお知らせください!!

于 2012-06-10T09:32:28.587 に答える