-2
int bNum=3;
int aNum=3;
for (int i = 0; i < bNum; i++)
        {
            for (int j = 0; j < aNum; j++)
            {
                b[i] += a[j];
                b[i + 1] += a[j + 3];
                b[i + 2] += a[j + 6];
            }
        }

私は基本的に次のことを実現したいと思っています。

b[0]=a[0]+a[1]+a[2];
b[1]=a[3]+a[4]+a[5];
b[2]=a[6]+a[7]+a[8];

私のロジックの何が問題になっていますか?

ハハ!おっと!私の眠そうな目は愚かな質問を説明しています。反復ごとに複数回計算されることがわかります。

4

2 に答える 2

7

言語が何であれ、bには定数インデックス、aには変数インデックスを作成する必要があります。

 for (int j = 0; j < aNum; j++)
        {
            //here is loop-unrolling for b
            b[0] += a[j];
            b[1] += a[j + 3];
            b[2] += a[j + 6];
        }



  for(k=0;k<max;k++)
  {
  for (int j = 0; j < aNum; j++)
        {
            //without loop-unrolling
            b[k] += a[j+k*3];

        }
   }

「k」ループを外側にして、a[]をできるだけ継続的に読み取れるようにしました。「k」ループを内側に作成することもできますが、ここからそこにジャンプするa []の読み取りが行われ、ここに戻って再びジャンプするため、速度が低下します。これはベクトルではありませんが:P私はスペースを埋めるためにそれを使用しました

于 2012-07-31T09:45:56.077 に答える
1

質問は一種の矛盾しています。両方の配列の長さは同じですが、要件は同じではありません。

要求が正しいと仮定すると、次のことができます。

すべてのb要素について、次の3つの要素の合計があります。a

int bNum=3;    
int aIndex = 0;
for (int i = 0; i < bNum; i++)
{
   for (int j = 0; j < 3; j++)      
       b[i] += a[aIndex ++];

}

ここには配列境界の制御はありません。これは当然のことながら単なるサンプルコードです。

これがあなたが探しているものではない場合は、明確にしてください。

于 2012-07-31T09:49:25.690 に答える