2017-09-26 9 views
3

dgemmまたはanyother lapack/blas関数を使って、行列Aの部分集合に別の行列を掛けたいと考えています。サブマトリックスの要素は連続していない可能性があるので、サブマトリックスを別の空間にコピーすることなく直接dgemmを使用することはできません。したがって、このサブマトリックス自体が大きければ、Cでのこの特定の問題のために乗算のコードを記述する方が良いかもしれないという点で非常に非効率的であるかもしれません。lapack/blas自体をコピーして使用すると、まったく効率的でないかもしれません。私はmexファイルとしてmatlabにlapack/blasを使用しています。lapack/blasを使用して行列のサブセットを別の行列に掛ける

私の質問は

の1-乗算で部分行列上で動作することができますLAPACK/BLASのいずれかの機能がありますか。 2 - そうでない場合は、乗算のコードを直接書く方が良いか、またはサブマトリックスを別のマトリックスにコピーしてdgemmを使用する方が良いでしょうか?

答えて

4

実際にdgemmはサブマトリックスの乗算用に設計されています。各行列と引数の開始ポインタを正しく使用するだけでよい。LDALDBLDC

BLASのC変異体である:

  • A(15x10)
  • B(10x20)
  • C(15x20)

void cblas_dgemm (const CBLAS_LAYOUT layout, const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const double alpha, const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc); 

は、あなたが行列を持っていると言いますBの時点(3,5)から始まるA

  • Bs(2x5)の時点(2,1)から始まる

    • As(3x2):あなたは部分行列を渡すdgemmを呼び出す必要があるとし

      cblas_dgemm (CblasColMajor, CblasNoTrans, CblasNoTrans, 15, 20, 10, 1., A, 15, B, 10, 1., C, 15); 
      

      を:Column Majorマトリックスストレージ用dgemmを呼び出す

    • Cs(3x5)MN

  • Cの点 (4,2)始まる、 K 3、5、2に変更しますが、 LDXsは上記と同じままです。次に、各サブマトリックスの開始点を指すように、 dgemmへの正しいポインタを渡す必要があります。番号が Cであるため、各座標から1を引く必要があります。

    • As出発点はA + (1+0*15)
    • Bs出発点はB + (2+4*10)
    • Cs出発点はNLDAのアイデアは、私は肝炎ということであるC + (3+1*15)

      cblas_dgemm (CblasColMajor, CblasNoTrans, CblasNoTrans, 3, 5, 2, 1., A+1, 15, B+42, 10, 1., C+18, 15); 
      

    ですされます行列A(LDA,*)ですが、私は上部サブマトリックスAs(N,*)を使用します。この例では、上部サブマトリクスを使用するのではなく、内部の別のサブマトリクスを使用したいと考えています。A。この場合、行列に新しいポインタA+1を作成します。今すぐAsA+1の上位サブマトリックスです。

    同様CからのFortranのオリジナルdgemm関数を呼び出すことは

    char NoTrans = `N`; 
        int N = 3; 
        int M = 5; 
        int K = 2; 
        int LDA = 15; 
        int LDB = 10; 
        int LDC = 15; 
        double alpha = 1.0; 
        double beta = 1.0; 
        dgemm (&NoTrans, &NoTrans, N, M, K, alpha, A+1, LDA, B+42, LDB, beta, C+18, LDC); 
    
    +0

    になりありがとうございました。あなたはこのように使うことを意味するものをもう少し説明してください。 blas_dgemmは、各列の行列とサイズの開始を知らないので、サブマトリックスの次の要素をどのように見つけますか? matlabのlapack/blasでこれを使うことができますか?申し訳ありませんが、私はこれに新しいです。 – user85361

    +0

    @ user85361 'C'に言及したので、私はちょうどcblas相当の言及しました。 mexファイルにもオリジナルのFortranの 'dgemm'を使うことができます。私は答えを更新する – ztik

    +0

    優れています。どうもありがとうございました。 – user85361

    関連する問題