问题
The intention of this program is to create a larger array of bytes scaled up by a factor of 10 from the original array. For example, the 1 in [0][0] should be a 10x10 square of 1's in the new array. I provide the code and the output, which seems to work properly during population of the larger array, but then prints different values. I'm currently experimenting with just the rows in order to limit the number of variables I'm dealing with during testing. Can anyone think of a reason why this happens?
public class Test
{
static byte[][] byteArray =
{{1, 0},
{0, 1}};
public static void main(String[] args)
{
byte newarray[][] = converter();
for(int i = 0; i < 20; i++)
{
System.out.println(newarray[i][0]);
}
}
private static byte[][] converter()
{
byte[][] b = new byte[20][20];
for(int r = 0; r < 2; r++)
{
for(int i = 0; i < 10; i++)
{
b[r+i][0] = byteArray[r][0];
System.out.println(byteArray[r][0]);
System.out.println(b[r+i][0]);
}
}
return b;
}
}
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
回答1:
Why not just use truncated integer division to your advantage:
static void printMat(byte[][] mat)
// just a utility function to print a matrix
{
for(byte[] row : mat)
{
System.out.println(Arrays.toString(row));
}
}
private static byte[][] stretch(byte[][] bytes, int rfactor, int cfactor)
// stretch the matrix in 'bytes'
//stretch the rows by 'rfactor' and the columns by 'cfactor'
{
// create an empty matrix:
int rows = bytes.length*rfactor; // rows in the new matrix
int cols = bytes[0].length*cfactor; // columns in the new matrix
byte[][] out = new byte[rows][cols]; // our new, stretched matrix
// loop through the rows and columns of the *new* matrix:
for(int r = 0; r < rows; r++)
{
for(int c = 0; c < cols; c++)
{
// Divide the row and column indices by the
// appropriate factors to find the correct value
// in the original matrix.
// Integer division just drops any remainder,
// which is what we want.
out[r][c] = bytes[r/rfactor][c/cfactor];
}
}
return out;
}
public static void main(String[] args) throws Exception
{
// your example:
byte[][] byteArray =
{{1, 0},
{0, 1}};
byte[][] newarray = stretch(byteArray, 10, 10);
printMat(newarray);
System.out.println();
// can stretch any matrix by any dimensions:
byte[][] byteArray2 =
{{1, 2, 3},
{4, 5, 6}};
byte[][] newarray2 = stretch(byteArray2, 3, 2);
printMat(newarray2);
}
output:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 2, 2, 3, 3]
[1, 1, 2, 2, 3, 3]
[1, 1, 2, 2, 3, 3]
[4, 4, 5, 5, 6, 6]
[4, 4, 5, 5, 6, 6]
[4, 4, 5, 5, 6, 6]
来源:https://stackoverflow.com/questions/16556328/scaling-an-array-matrix