Might sound too simple to you but I need some help in regrad to do all folowings in one shot instead of defining redundant variables i.e. tmp_x, tmp_y:
[tmp_x, temp_y] = ind2sub(size(G), find(G == 0));
(More info: G is a sparse matrix)
X(:)=ind2sub(size(G), find(G == 0));
but that threw an error. How can I achieve this without defining tmp_x, tmp_y?
Best How To :
A couple of comments with your code:
numel(find(G == 0)) is probably one of the worst ways to determine how many entries that are zero in your matrix. I would personally do
numel(G) - nnz(G).
numel(G) determines how many elements are in
nnz(G) determines how many non-zero values are in
G. Subtracting these both would give you the total number of elements that are zero.
- What you are doing is first declaring
X to be sparse... then when you're doing the final assignment in the last line to
X, it reconverts the matrix to
double. As such, the first statement is totally redundant.
If I understand what you are doing, you want to find the row and column locations of what is zero in
G and place these into a
N x 2 matrix. Currently with what MATLAB has available, this cannot be done without intermediate variables. The functions that you'd typically use (
ind2sub, etc.) require intermediate variables if you want to capture the row and column locations. Using one output variable will give you the column locations only.
You don't have a choice but to use intermediate variables. However, if you want to make this more efficient, you don't even need to use
ind2sub. Just use
[I,J] = find(~G);
X = [I,J];