2017-01-21 2 views
-4

行列の乗算は、配列の概念を使って静的にメモリを割り当てることでうまくいくが、メモリ割り当てが動的であれば非常に良いものになる。C/C++とGolangで単一のトリプルポインタを使用して行列乗算を実装する方法は?

1つのトリプルポインタを使用して2つの整数行列をどのように乗算するかを知りたいと思います。ここでは、行のメモリ割り当てが連続していないと考えています(行列については当てはまりません)。行はメモリ内の異なる場所に置くことができます。これはストレートフォワード思わ

enter image description here

Note: 
    1) aaaa, bbbb, cccc, xxxx & r000,r010,r020 etc. are addresses. 

    2) aaaa,bbbb,cccc are the starting address of an array of pointers to different rows of a matix. 

    3) xxxx is the starting address of an array of pointers each pointing to different array of pointers to rows. 

    4) q is triple pointer. 

    5) We have to take input for first 2 matrices and store the result in 3rd matrix. 
+1

あなた自身で問題を解決しようとしましたか?はいの場合は、試した内容を投稿し、どこに問題があるのか​​を説明してください。 See [ask]。 –

+0

いいえ、それはポインタのコンセプトを使用して実装できるので、それについて考えてみましょう。私はゴランでそれを試しています。 –

+2

あなたが試したことを投稿すると、ここで助けを受ける可能性が高くなります。何の努力もしていない質問を投稿することはあまり役に立ちません。 –

答えて

-1

明確にするため、以下の画像をご覧下さい。理由だけタイプの、行列の要素が依然としてa[i][j]として書き込まれること

typedef int **matrix; 

注:

我々は、第1のタイプint **ように、ダブルポインタとしてタイプmatrixを定義しますaがポインタの配列へのポインタの代わりに配列の配列である場合のように。

この定義では、我々はいくつかの行列関数を定義することができます。

#include <stdio.h> 
#include <stdlib.h> 

matrix 
alloc_matrix(int n, int m) { 
    int i; 
    matrix a; 

    a = (int **) malloc(n*sizeof(int *)); 
    for (i = 0; i < n; i++) 
    a[i] = (int *) malloc(m*sizeof(int)); 
    return a; 
} 

void 
free_matrix(matrix a, int n, int m) { 
    int i; 

    for (i = 0; i < n; i++) 
    free(a[i]); 
    free(a); 
} 

void 
print_matrix(matrix a, int n, int m) { 
    int i, j; 

    for (i = 0; i < n; i++) 
    for (j = 0; j < m; j++) 
     printf("%d%s", a[i][j], j < m - 1 ? " " : "\n"); 
} 

void 
set_const_matrix(matrix a, int n, int m, int c) { 
    int i, j; 

    for (i = 0; i < n; i++) 
    for (j = 0; j < m; j++) 
     a[i][j] = c; 
} 

void 
multiply_matrices(matrix a, matrix b, int n, int m, int l, matrix ab) { 
    int i, j, k; 
    int sum; 

    for (i = 0; i < n; i++) 
    for (k = 0; k < l; k++) { 
     sum = 0; 
     for (j = 0; j < m; j++) 
     sum += a[i][j] * b[j][k]; 
     ab[i][k] = sum; 
    } 
} 

その後、我々はまた、あなたのthree address呼び出し規約を使用してmultiply_matricesをinvoes機能multiply_tripleを持っている:

void 
multiply_triple(int ***p, int n, int m, int l) { 
    multiply_matrices(p[0], p[1], n, m, l, p[2]); 
} 

最後に我々がこれをテストあなたの質問の図の中のマトリックス:

int 
main() { 
    int ***p, i; 

    p = (matrix *) malloc(3*sizeof(matrix)); 
    for (i = 0; i < 3; i++) 
    p[i] = alloc_matrix(3, 3); 
    set_const_matrix(p[0], 3, 3, 1); 
    set_const_matrix(p[1], 3, 3, 1); 
    multiply_triple(p, 3, 3, 3); 
    print_matrix(p[2], 3, 3); 
    return 0; 
} 

確かにこれはあなたの写真からの出力が得られます。

3 3 3 
3 3 3 
3 3 3 

あなたは柔軟性があなたの行列は非正方形である必要があり、あるいは寸法が世界的に固定したいしたくない場合は、あなたがの一部またはすべてを省略することができますn,mおよびlのパラメータ。

構造体の境界でダブルポインタをパックし、結果をそれ自体で割り当てるなどしてもかまいません。しかし、あなたは "トリプルポインタ"アプローチをもう利用できません。

+0

いいえ、実際には、最初の2つの列のそれぞれの1の2番目の列は3x3行列の内容を表し、3番目の列は最初の2つの行列の乗算結果を表します。 –

+0

@リシケシ:そうだ。それは奇妙な大会です!しかし、この説明に基づいて私は少し私の答えに適応します、私は助けてくれることを願っています。 –

+0

@リシケシ:これはどうですか? –

関連する問題