Simplicity
Simplicity

Reputation: 48916

Locations of pixels and setting them to `1`

In matlab, after meeting a specific criterion, I used to return back the pixel itself and store it in the vector pixels as follows:

pixels(index) = y(i,j);

Now, I would like to return the location of those pixels. Should I do the following?

pixels(index) = i,j;

EDIT

If I want to then set those indexes to the value 1, I do the following, right?

for i=1:m
for j=1:n
y(i,j)=1
end
end

Thanks.

Upvotes: 0

Views: 703

Answers (2)

Shai
Shai

Reputation: 114796

It is extremely inefficient to do so in a nested loop in Matlab.

Using sub2ind can help you do so much faster:

y( sub2ind( size(y), i, j ) ) = 1;

EDIT - sub2ind

What sub2ind does?
Suppose you have a matrix M of size [4 6]:

M = [ 1  5  9  13  17  21
      2  6 10  14  18  22 
      3  7 11  15  19  23
      4  8 12  16  20  24 ];

You wish to access two elements: the one at the first row and second column, and another at the fourth row and the fifth column. In that case you have the rows you wish to access r = [ 1 4 ] and the columns you wish to access c = [ 2 5 ]. However, if you try and access

>> M( r, c )

This is a 2x2 matrix

ans = 
5  17
8  20

And not the two elements you were looking for (which are 5 and 20).

What sub2ind does is convert the row/column indices you have into linear indices

>> sub2ind( size(M), r, c )
ans =
5 20

which happens to be the linear indices of the requested entries.

You can think of linear indices as the single index required to access an element in a matrix in the case that the matrix was converted to a vector stacking its columns one after the other.

A few comments:

  1. Matlab has a few ways of indexing matrices: by row / column indices (like i and j in your question). By linear indices (like index in your question). However, the more efficient way is to use logical indexing: that is, using a matrix of the same size as y with true for the entries you wish to set / get.
    So, in your example, if you could get such a logical matrix instead of index or i and j it would have been better.

  2. Matlab has many advantages over other programing languages. One of them is its ability to perform vector/matrix operations extremely efficient. Resorting to loops, or worse, nested loops, is something that should be avoided in Matlab.

  3. It is not a good practice to use i and j as variables in Matlab.

Upvotes: 2

Dennis Jaheruddin
Dennis Jaheruddin

Reputation: 21563

If you want to find the occurrence of a value y(i,j) simply evaluate

idx = (pixels == y(i,j));

Depending on your variables you can then probably do

index(idx) = 1;

Upvotes: 1

Related Questions