這不行嗎?它複製尺寸爲n/2的陣列< = g < = n * 2。附有測試案例。它使用標準循環和簡單的if語句來提高可讀性。
void CopydArrayScaled(int[,] g, int[,] n)
{
int gRowSkip = g.GetLength(0) - n.GetLength(0);
for (int nRowIdx = 0, gRowIdx = 0; nRowIdx < n.GetLength(0); nRowIdx++)
{
int gColSkip = g.GetLength(1) - n.GetLength(1);
for (int nColIdx = 0, gColIdx = 0; nColIdx < n.GetLength(1); nColIdx++)
{
n[nRowIdx, nColIdx] = g[gRowIdx, gColIdx];
if (gColSkip > 0)
{
gColSkip--;
gColIdx += 2;
}
else if (gColSkip < 0)
{
if (nColIdx % 2 == 1)
{
gColIdx++;
gColSkip++;
}
}
else
{
gColIdx++;
}
}
if (gRowSkip > 0)
{
gRowSkip--;
gRowIdx += 2;
}
else if (gRowSkip < 0)
{
if (nRowIdx % 2 == 1)
{
gRowIdx++;
gRowSkip++;
}
}
else
{
gRowIdx++;
}
}
}
void CopydArrayScaled2(int[,] g, int[,] n)
{
int gRowSkip = g.GetLength(0) - n.GetLength(0);
for (int nRowIdx = 0; nRowIdx < n.GetLength(0); nRowIdx++)
{
int gRowIdx = nRowIdx * g.GetLength(0)/n.GetLength(0);
int gColSkip = g.GetLength(1) - n.GetLength(1);
for (int nColIdx = 0; nColIdx < n.GetLength(1); nColIdx++)
{
int gColIdx = nColIdx * g.GetLength(1)/n.GetLength(1);
n[nRowIdx, nColIdx] = g[gRowIdx, gColIdx];
}
}
}
void PrintArray(int[,] a)
{
Console.WriteLine("Destination dimensions: [{0},{1}]", a.GetLength(0), a.GetLength(1));
for (int i = 0; i < a.GetLength(0); i++)
{
for (int j = 0; j < a.GetLength(1); j++)
{
if (j != 0) Console.Write(",");
Console.Write(a[i, j]);
}
Console.WriteLine();
}
}
void Test()
{
int[,] g = new int[4, 4] { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } };
int[,] n = new int[2, 2];
CopydArrayScaled(g, n);
PrintArray(n);
int [,] n2 = new int[8, 8];
CopydArrayScaled(g, n2);
PrintArray(n2);
int[,] n3 = new int[4, 4];
CopydArrayScaled(g, n3);
PrintArray(n3);
}
輸出:
Destination dimensions: [2,2]
0,2
8,10
Destination dimensions: [8,8]
0,0,1,1,2,2,3,3
0,0,1,1,2,2,3,3
4,4,5,5,6,6,7,7
4,4,5,5,6,6,7,7
8,8,9,9,10,10,11,11
8,8,9,9,10,10,11,11
12,12,13,13,14,14,15,15
12,12,13,13,14,14,15,15
Destination dimensions: [4,4]
0,1,2,3
4,5,6,7
8,9,10,11
12,13,14,15
注:加版2。這將使n和g至是任意的大小,但不粘附到原來的問題:跳過每個第二行/列。對於尺寸(n * 2> g),跳過方法會產生奇怪的結果。
你嘗試過什麼嗎? – 2014-11-01 20:48:51
告訴我們你試過的是什麼 – dotnetom 2014-11-01 20:50:38
我嘗試着聲明2個變量,它們是biggersize-smallersize,然後以某種方式將它變成2 for循環(它遍歷小數組的索引)。然後,我嘗試在var> 0的情況下沿着線條擺弄smth,例如對於列,smallerarray [i,j] =更大的數組[i,j + 1],但是vs告訴我要麼檢查索引,要麼放入索引錯誤的價值觀。在我的幫助變量達到0後,我可能遇到了編碼零件的問題。 – Ironowicz 2014-11-01 20:53:42