Get elements of a matrix that are greater than sum of their two indices in row major order
2 views (last 30 days)
Show older comments
I'm Writing a function called `large_elements` that takes input an array named `X` that is a matrix or a vector. The function identifies those elements of `X` that are greater than the sum of their two indexes.
For example, if the element `X(2,3)` is `6`, then that element would be identified because `6 > (2 + 3)`. The output of the function gives the indexes(row and column sub) of such elements found in *row-major order*. It is a matrix with exactly two columns. The first column contains the row indexes, while the second column contains the corresponding column indexes.
Here is an example, the statement
indexes = large_elements([1 4; 5 2; 6 0])
should give the output like this:
[1 2; 2 1; 3 1]
If no such element exists,
the function returns an
`empty array`.
I have came up with the following code
function indexes = large_elements(A)
[r c] = size(A);
ind = 1;
for ii = 1:r
for jj = 1:c
if A(ii,jj) > ii + jj
indexes(ind,:) = [ii jj];
ind = ind + 1;
else
indexes = [];
end
end
end
end
But the results are not as expected. Any help would be appreciated.
Answers (2)
Andrei Bobrov
on 23 May 2015
Edited: Andrei Bobrov
on 23 May 2015
a = [1 4; 5 2; 6 0]; % your data
n = size(a);
[x,y]=ndgrid(1:n(1),1:n(2));
[ii,jj] = find(a > (x + y));
out = sortrows([ii(:),jj(:)],1);
or
n = size(a);
[ii,jj] = find(a > hankel(2:n(1)+1,(1:n(2))+n(1)));
out = sortrows([ii(:),jj(:)],1);
or
n = size(a)
[ii,jj] = find(a > bsxfun(@plus,(1:n(1))',1:n(2)));
out = sortrows([ii(:),jj(:)],1);
or
n = size(a');
[ii,jj] = find(a' > bsxfun(@plus,(1:n(1))',1:n(2)));
out = [jj(:),ii(:)];
2 Comments
Jan
on 24 May 2015
@Alisha: Please explain, which version is not working properly and which problem you observe.
Stephen23
on 23 May 2015
Edited: Stephen23
on 23 May 2015
Solving this kind of problem using two nested loops is very poor use of MATLAB, especially as the output array is growing inside the loops: without any array preallocation this is a slow and very inefficient use of MATLAB. It would be much faster and much simpler using vectorized code, such as this:
function Z = large_elements(X)
[r,c] = size(X);
[r,c] = find(X > bsxfun(@plus, (1:r)', 1:c));
Z = sortrows([r,c]);
which outputs this when run:
>> large_elements(5*ones(3))
ans =
1 1
1 2
1 3
2 1
2 2
3 1
See Also
Categories
Find more on Matrices and Arrays in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!