2016-05-06 19 views
-1

ポインターの助けを借りて次元配列を実装することを学んでいました。行列の乗算にポインタが付いていました。ポインタを使わずに行列乗算プログラムを理解しました。それは次のように来る:私は、上記のコード部分を得ることはありません彼らを正確に何を参照解除され、ポインタを使った行列の乗算

for(i=0;i<r1;i++)  
for(j=0;j<c2;j++)  
for(k=0;k<c1;k++)  
    *(*(c+i)+j)+=*(*(a+i)+j)*(*(*(b+k)+j)); 

ポインタを使用して
for(i=0; i<r1; ++i) 
for(j=0; j<c2; ++j) 
for(k=0; k<c1; ++k) 
    mult[i][j]+=a[i][k]*b[k][j]; 

、コードは次のようですアスタリスクは、乗算を表しますか?事前に自分の無知のために申し訳ありません

、おかげで(:。

+0

_fifth_アスタリスクは乗算 – ForceBru

+0

2次配列(別名「マトリックス」)ではseconveバージョンは機能しません。 – Olaf

+0

最初のバージョンではポインタも使用しています。配列なしでアクセスすることはできません。あなたの質問には情報がありません。 [ask]を参照し、[mcve]を提供してください。 – Olaf

答えて

1

すべてのこれらの行列が2つのレベルの配列であり、値の配列へのポインタの配列で構成されては、これは作ることビットでそれを行うには醜いです後者の方法

最初に、配列*(c+i)の最初のデアプリンスです。次に、その配列から必要な項目を追加して逆参照すると、*(*(c+i)+j)になります。かかる。

あなたもポインタを持つ第一のタイプのコードを使用することができます。そのコードはあなたに醜い

*(*(c+i)+j)+=*(*(a+i)+j) * (*(*(b+k)+j)); 
         ^this 

場合、私はあなたを助ける何かを伝えることができます。今だけ実際の乗算は開閉カッコの間にアスタリスクがあります。 c[i]は、*(c+i)とまったく同じです。あなたの人生は少なくとも7.935%改善され、保証されています。

+0

だから、要するに。 c [i] [j]の代わりに、*(*(c + i)+ j)を使用します。すべての行列についても同様です。うわー、それを分解すると、コードが簡単になりました。ありがとう! :) –

+1

@AnirudhMuraliはい、ポインタを使って 'c [i] [j]'を使い続けるともっと楽になります。なぜなら、これは2次元配列であるという意味を伝えているからです。 –

+0

助けていただきありがとうございます。これは割り当てのためのものですので、ポインタでのみ実装しています。 –