簡體   English   中英

'裁剪'二維數組?

[英]'Crop' a two dimensional array?

我正在尋找一種高效的方式來裁剪二維數組。 考慮這個例子:

我有一個二維數組,組成一個100x100網格。 我只是想回報一下,60x60。 這是一個'a'方法的例子,但我正在尋找指向最有效的方法。

// Settings
var gridWidth = 100;
var gridHeight = 100;

// Populate Grid
var grid = [];

for(var i = 0; i<gridWidth; i++){
    grid[i] = [];
    for(var j = 0; j<gridHeight; j++){
        grid[i][j] = 0;
    }
}

// Crop Grid
var rect = {x:20,y:20,w:60,h:60};

var crop = [];
for(var i = rect.x; i<rect.x+rect.w; i++){
    crop[i-rect.x] = [];
    for(var j = rect.y; j<rect.y+rect.h; j++){
        crop[i-rect.x][j-rect.y] = grid[i][j];
    }
}

任何想法都非常感謝......

約翰

試試這種方式:

crop = grid.slice(rect.x, rect.x+rect.w);
for(var i = 0; i<crop.length; i++){
    crop[i] = crop[i].slice(rect.y, rect.y+rect.h);
}

注意,數組的維度現在是rect.w x rect.h ,所有索引分別由rect.xrect.y負偏移。

怎么樣:

function tab(n, func) {
    for (var a = [], i = 0; i < n; i++)
        a.push(func(i));
    return a;
}

function matrix(w, h, values) {
    return tab(h, function(y) {
        return tab(w, function(x) {
            return values(x, y);
        })
    })
}

grid = matrix(7, 10, function(x, y) {
    return x + ':' + y;
})

這給了我們:

0:0 1:0 2:0 3:0 4:0 5:0 6:0
0:1 1:1 2:1 3:1 4:1 5:1 6:1
0:2 1:2 2:2 3:2 4:2 5:2 6:2
0:3 1:3 2:3 3:3 4:3 5:3 6:3
0:4 1:4 2:4 3:4 4:4 5:4 6:4
0:5 1:5 2:5 3:5 4:5 5:5 6:5
0:6 1:6 2:6 3:6 4:6 5:6 6:6
0:7 1:7 2:7 3:7 4:7 5:7 6:7
0:8 1:8 2:8 3:8 4:8 5:8 6:8
0:9 1:9 2:9 3:9 4:9 5:9 6:9

裁剪功能:

function crop(mat, x, y, w, h) {
    return mat.slice(y, y + h).map(function(row) {
        return row.slice(x, x + w)
    })
}

cropped = crop(grid, 2, 1, 5, 6)

結果:

2:1 3:1 4:1 5:1 6:1
2:2 3:2 4:2 5:2 6:2
2:3 3:3 4:3 5:3 6:3
2:4 3:4 4:4 5:4 6:4
2:5 3:5 4:5 5:5 6:5
2:6 3:6 4:6 5:6 6:6

您可以嘗試使用Array#slice [MDN]並查看是否獲得任何性能改進。 還要盡量避免不必要的計算:

var yend = rect.y + rect.h;
var crop = [];

for(var i = rect.x, j = 0, l = rect.x + rect.w; i < l; i++,j++){
    crop[j] = grid[i].slice(rect.y, yend);
}

您可以測試是否值得測試邊緣情況。 例如,如果rect.x和/或rect.y0並且您不再需要原始數組,則只需設置數組的.length (修改它們):

var rect = {x:0,y:0,w:60,h:60};

grid.length = rect.w;

for (var i = 0; i < rect.w; i++) {
    grid[i].length = rect.h;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM