我正在尝试解决编码网站上的挑战。问题是关于int矩阵。我正在使用c#language。我需要创建一个函数,它将参数作为int[][]
(整数矩阵)并返回int[][]
(另一个整数矩阵)。问题的开始(给我的空函数)就像那样
int[][] boxBlur(int[][] image) {
}
这是我到目前为止所尝试的
int[][] boxBlur(int[][] image) {
int pixelLength = image[0].Length - 2;
int[][] newBox = new int[pixelLength][pixelLength];
int pixelSum = 0;
int c = 0;
for(int t = 0; t<pixelLength; t++)
{
for(int i = 0; i<pixelLength; i++)
{
for(int j = t; j < 3 + t ; j++)
{
for(int k = i; k < i+3 ; k++)
{
pixelSum += image[j][k];
}
}
newBox[t][i] = pixelSum / 9;
}
}
return newBox;
}
现在我对算法没有任何问题,可能它会起作用,但问题是我无法定义像int[][]
这样的数组。它给出了像Cannot implicitly convert type int to int[][]
这样的错误,当我尝试创建像
int[,] newBox = new int[pixelLength,pixelLength];
它也会出错,因为它表示返回类型错误,我无法更改返回类型,所以我需要定义一个与int[][]
完全相同的矩阵。
有没有办法做到这一点,还是我需要尝试另一种方式?
答案 0 :(得分:6)
int[][]
是锯齿状数组,换句话说,是数组。
当您看到int[]
时,您将其理解为整数数组。也就是说,数组的每个“槽”都保持整数。除了每个插槽都有一个数组外,数组数组完全相同。
一旦你理解了这一点,为什么初始化锯齿状阵列的正确方法应该是完全合理的:
int[][] newBox = new int[pixelLength][];
现在您已经说newBox
是一个int数组数组:newBox[0]
类型为int[]
,newBox[1]
类型为int[]
,等等。因为数组的默认值与任何其他引用类型一样null
,所以newBox[0]
,newBox[1]
等的值为null
;你需要初始化它们中的每一个。
锯齿状数组的优点当然是每个int[]
可以是您想要的大小,因此名称为锯齿状数组。
因此,在正确初始化锯齿状数组之后,您基本上缺少的是在使用它们之前将int[]
数组中的每个和每个数组初始化。你可以在适当的循环中完成这个。
从这里开始应该很容易。
验证您是否正确理解所有内容的有趣测试是初始化并正确填写以下类型的所有值:
int[][][] myHeadHurtsArray;
答案 1 :(得分:3)
int[][]
和int[,]
是两回事。第一个是Jagged Array,第二个是Multidimensional Array。
初始化锯齿状数组时,只能给出数组长度,而不是其中所有数组的长度:
int[][] newBox = new int[pixelLength][];
每次插入新数组:
newBox[index] = new int[size];