2

グリッド内の各セルの幾何学的量を保持する class_geometry というクラスがあります。これらの量の 1 つは、セルの 4 つのコーナーのそれぞれの x 位置です。次に、これらのクラス オブジェクトの配列を初期化します (私の用語が正しいかどうかはわかりません)。私の問題は、クラス定義で配列を初期化する方法がわからないことです。これが私のクラスです:

classdef class_geometry
    properties
        dx1;
        dx2;
        dx3;
        dx4;
    end
end

そして、4 つの異なる値を保持する dx だけが必要です。

classdef class_geometry
    properties
        dx;
    end
end

したがって、最終的には次のようなことができます。

for i = 1:IL+1
    for j = 1:JL+1
        cell(i,j).dx(1) = x_grid(i+1,j)   - x_grid(i,j);
        cell(i,j).dx(2) = x_grid(i+1,j+1) - x_grid(i+1,j);
        cell(i,j).dx(3) = x_grid(i,j+1)   - x_grid(i+1,j+1);
        cell(i,j).dx(4) = x_grid(i,j)     - x_grid(i,j+1);
    end
end

助けてくれてありがとう。

4

1 に答える 1

1

問題がクラスの配列を初期化することである場合は、コンストラクターを定義する必要があります。コンストラクターは、オブジェクトを初期化するときに呼び出され、オブジェクト メンバーにメモリを割り当てることを目的としています。

配列を初期化して空にする方法は次のとおりですdx

   classdef class_geometry
       methods

         function obj = class_geometry()   //Constructor function
             obj.dx = zeros(1,4);   //because you had 4 entries
             ...

         end

        end
        .....
   end

さらに、コンストラクターに含まれる値を初期化する場合dxは、現在のグリッド セルのインデックスを渡す必要があります。

       function obj = class_geometry(i,j)   //Constructor function, 2nd version
                                            //i,j indices of the cell
             obj.dx = zeros(1,4);   //because you had 4 entries
              dx(1) = x_grid(i+1,j)   - x_grid(i,j);
              dx(2) = x_grid(i+1,j+1) - x_grid(i+1,j);
              dx(3) = x_grid(i,j+1)   - x_grid(i+1,j+1);
              dx(4) = x_grid(i,j)     - x_grid(i,j+1);

       end

これで、セルを次のように初期化できます

      cell(i,j) = class_geometry(i,j); //forall i,j.

代わりに、問題がオブジェクトの配列の初期化である場合は、この参照を検討することをお勧めします。


最後に、私の控えめな推測では、あなたが試みているベクトル化は最適ではないということです。

マトリックスx_gridにグリッドがあるため、(最初のケースの場合) のようなベクトル化

  dx_1 = diff(x_grid,1,1); //computes x_grid(i+1,j) - x_grid(i,j); 
                           //forall i,j producing the difference matrix

より効率的になります。それはあなたに多くの外部サイクルを節約します(クラスに関して)。

于 2012-11-12T13:04:46.843 に答える