2016-04-02 8 views
1

Örneğin, bir 10×10 matrisim varsa ve bu matriste n koordinatlarının bir listesi varsa, her bir koordinatı çevreleyen 3×3 bölgesini almak istiyorum, uzunluğu 9 vektörü olarak yeniden boyutlandırıp tüm 9×n matrisine vektörler. Bunu yapmak için bir döngü yazabileceğimi biliyorum ama bu muhtemelen sonuçta ne yapacağım olsa da, iğrenç görünüyor.Matriste birden çok yerel bölgeyi yeni bir matrise dönüştürmek mümkün mü?

+0

İlk düşünce: "10" 10 "kez çalıştırmak yerine" n "kez çalıştıran bir döngü yazabilirsiniz. Koordinatların sayısı kesinlikle en az 10 * 10' (veya matrisinizdeki elemanların sayısı) daha az olacaktır. Bu, diğer her işi hemen hemen tümleştirebildiğiniz için bazı hesaplama zamanlarını koruyacaktır. Pseudocode'da şöyle bir şey olurdu: i = 1: n; koordinat çevresi 3x3 bölgesini ayıklayın * i *; birleştirme matrisi – Alessiox

cevap

1

koordinatları endeksi şeklinde zaten varsayarsak, bu kullanabilirsiniz: Tabii, bu koordinatlar için

c1 = [3 3; 7 5; 4 7]; 
cc = sub2ind(size(A), c1(:,1), c1(:,2)); 

kontrol etmez:

m = 10; 
A = rand(m); 
cc = [23; 47; 64]; 
ind = bsxfun(@plus, [(-1:1) - m, (-1:1), (-1:1) + m], cc); 
newVals = A(ind); 

Veya ilk dönüştürme indeks forma koordinatları Matrisin kenarlarında olmak ve koordinatlardan herhangi biri varsa bir hata atmak.

2

Bunun bir for döngüsünden daha fazla performans gösterip göstermediğinden emin değilim, ancak bunu dizin değerleri üzerinde bazı hesaplamalar yaparak yapabilirsiniz.

data = magic(5); 

%//  17 24  1  8 15 
%//  23  5  7 14 16 
%//  4  6 13 20 22 
%//  10 12 19 21  3 
%//  11 18 25  2  9 

%// The coordinates you want to sample at (row, col) 
coords = [2 3; 3 2; 2 4]; 

%// Determine the row and column offsets to apply for a 3x3 block 
[rowOffset, colOffset] = ndgrid(-1:1,-1:1); 

%// Compute the rows and columns included in each block centered t each point 
rows = bsxfun(@plus, coords(:,1).', rowOffset(:)); 
cols = bsxfun(@plus, coords(:,2).', colOffset(:)); 

%// Convert to absolute linear index and sample data at these regions 
newdata = data(sub2ind(size(data), rows, cols)); 

%// 24 23  1 
%// 5  4  7 
%// 6 10 13 
%// 1  5  8 
%// 7  6 14 
%// 13 12 20 
%// 8  7 15 
%// 14 13 16 
%// 20 19 22 

sen potansiyel aynı şeyi başarmak için konvolüsyonunu falan kullanabilirsiniz bu grupların her biri ile ne yapmak istediğinize bağlı olarak söyleniyor.

İlgili konular