1

3D配列をスライスで初期化する小さなテストケースプログラムをFORTRAN90で作成しました。これと同じ動作をCで簡単に再現できますか?

  program fortranEngine

  real(4) , dimension(10,10) :: tmp
  real(4) , dimension(10,10,3) :: p    

  tmp = RESHAPE( [  0.973, 1.053, 0,     0,     0,     0,     0,     0,     0,     0, &
                    1.053, 1.080, 0,     0,     0,     0,     0,     0,     0,     0, &
                    1.010, 0.408, 0.442, 0,     0,     0,     0,     0,     0,     0, &
                    1.119, 0.900, 0.399, 0.762, 0,     0,     0,     0,     0,     0, &
                    1.211, 0.975, 0.845, 0.952, 1.105, 0,     0,     0,     0,     0, &
                    1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,     0,     0,     0, &
                    1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,     0,     0, &
                    1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,     0, &
                    1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0, &
                    1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228] &
                    , [10,10] )    

    p(:,:,1) = tmp    

    ...

    end program fortranEngine
4

2 に答える 2

2

多かれ少なかれC99またはC2011でそれを行うことができますが、Fortranほど便利ではありません。初期化の順序に注意してください。Fortranはそれを1つの順序(column-major)で実行し、Cは他の順序(row-major)で実行します。それを無視すると、次のことができます。

float tmp[10][10] =
{
    { 0.973, 1.053, 0,     0,     0,     0,     0,     0,     0,     0,    },
    { 1.053, 1.080, 0,     0,     0,     0,     0,     0,     0,     0,    },
    { 1.010, 0.408, 0.442, 0,     0,     0,     0,     0,     0,     0,    },
    { 1.119, 0.900, 0.399, 0.762, 0,     0,     0,     0,     0,     0,    },
    { 1.211, 0.975, 0.845, 0.952, 1.105, 0,     0,     0,     0,     0,    },
    { 1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,     0,     0,     0,    },
    { 1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,     0,     0,    },
    { 1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,     0,    },
    { 1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0,    },
    { 1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228 },
};
float p[3][10][10];    

for (int i = 0; i < 3; i++)
    memmove(p[i], tmp, sizeof(tmp));

ただし、ディメンション[3]を宣言の最後から宣言の最初に移動したことに注意してください。Cでは、逆の方法はあまり意味がありません。したがって、表記法は多かれ少なかれ利用可能ですが、ストレージ管理の詳細により、目的を正確に達成する方法が明確になりません。

于 2013-03-14T13:56:36.667 に答える
1

これは簡単ですか?

for(int i = 0 ; i < 10 ; ++i) 
    for(int j = 0 ; j < 10 ; ++j )
        p[0][i][j] = tmp[i][j] ;
于 2013-03-14T13:49:32.077 に答える