not sure how to approach this
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have a 2D matrix. Let's say A=80x100; I need a way to visit each cell in this matix only once. Moreover my problem is a little more involved than that. Not only do I want to visit each cell only once but the user also defines a window of certain size. Let's say WINDOW=3x3. Then let's say I randomly choose a location on A that corresponds to indecies [2,3]. Then this is considered a central location and in my algorithm I will also consider points around this central location as specified by the window. Hence in this example I will also consider points at indecies [1,3],[3,3],[1,2],[2,2],[3,2],[1,4],[2,4],[3,4]. So in the next round when I am trying to figure out which cell in A to visit, I will not consider these 9 points in my random draw. Any suggestions? Thanks!
0 commentaires
Réponse acceptée
Matt J
le 1 Fév 2013
Modifié(e) : Matt J
le 1 Fév 2013
A=rand(80,100);
[m,n]=size(A);
winsize=3;
midwin=winsize/2+.5;
[dx,dy]=ndgrid(1:winsize);
jumps = sub2ind([m,n],dx,dy)-sub2ind([m,n],midwin,midwin);
B=A;
B(:)=1:numel(A);
B=B(midwin:end+1-midwin, midwin:end+1-midwin);
points=B(:);
numpoints=length(points);
while numpoints
randlocation=points(randi(numpoints));
window=randlocation+jumps;
%%%%%%%%%%%%do stuff to A(window)
points=setdiff(points,window(:));
numpoints=numel(points);
end
0 commentaires
Plus de réponses (2)
Sean de Wolski
le 1 Fév 2013
idx = randperm(numel(A));
To give you a list of random linear indices to visit.
Then use a for-loop to loop over these. When you get to one index, use ind2sub() to convert it to row/column coordinates (or do this before hand for all of them and loop over that.)
doc ind2sub %for more info
Then make your window by adding and subtracting floor(window_size/2) to the indices and do whatever operation you have on this. You could also do this addition/subtraction before hand and loop over that instead.
0 commentaires
jenka
le 1 Fév 2013
3 commentaires
Matt J
le 1 Fév 2013
Modifié(e) : Matt J
le 1 Fév 2013
In the code I gave you, randlocation will never be on the boundary. I excluded all locations without a full winsize x winsize neighborhood in this line
B=B(midwin:end+1-midwin, midwin:end+1-midwin);
If you're saying that you can't ignore boundary points, you could pre-embed your A matrix into a larger matrix, and modify as follows
A=rand(80,100);
winsize=3;
midwin=winsize/2+.5;
A0=A; %save original A
A=nan(size(A0)+winsize-1);
A(midwin:end+1-midwin, midwin:end+1-midwin)=A0; %enlarge
[m,n]=size(A);
[dx,dy]=ndgrid(1:winsize);
jumps = sub2ind([m,n],dx,dy)-sub2ind([m,n],midwin,midwin);
B=A;
B(:)=1:numel(A);
B=B(midwin:end+1-midwin, midwin:end+1-midwin);
points=B(:);
numpoints=length(points);
while numpoints
randlocation=points(randi(numpoints));
window=randlocation+jumps;
window(isnan(A(window)))=[]; %THROW AWAY NANS!!!!!!!!!!!!!
%%%%%%%%%%%%do stuff to A(window)
points=setdiff(points,window(:));
numpoints=numel(points);
end
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!