【问题标题】:Why do I get an error on Input out of range exception?为什么输入超出范围异常时出现错误?
【发布时间】:2012-07-31 09:43:36
【问题描述】:
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];

我的逻辑有什么问题?

哈哈!哎呀!我困倦的眼睛正在解释这个愚蠢的问题。我看到每次迭代都会计算多次。

【问题讨论】:

  • 数组的大小是多少? i+3 可能会超过它。
  • 您使用b[i + 6] 作为索引。我猜你的意思是b[2] = a[j + 6]

标签: c# c++ algorithm logic


【解决方案1】:

无论是什么语言,你都需要为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 我只是用它来填充空间

【讨论】:

  • 谢谢!我真的很累,无法思考。但我喜欢你的矢量化想法!
【解决方案2】:

这个问题有点矛盾。 两个数组的 length 相等,但要求不相等。

假设 requeirement 是正确的,您可以执行以下操作

对于每个b 元素,有一个suma下一个 3 个元素

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

}

这里没有任何数组边界控件。这自然只是一个示例代码。

如果这不是您要搜索的内容,请澄清。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多