# Find returns empty with inconsistent size

6 views (last 30 days)
Rub Ron on 26 Aug 2021
Commented: Walter Roberson on 26 Aug 2021
I have a variable x, that is a vector with a variable number of elements. When applying the function
find(x>0), for:
find([-1 -1 -1 -1 -1 -1]>0)
ans =
1×0 empty double row vector
find([-1 -1]>0)
ans =
1×0 empty double row vector
find([-1]>0)
ans =
[]
The problem I have is that when x has only one element, and the size of the output is not consistent. For instance, I would like to get an empty with the same size as "1×0 empty double row vector".
Any suggestions?

Walter Roberson on 26 Aug 2021
Edited: Walter Roberson on 26 Aug 2021
find([-1 -1 -1 -1 -1 -1]>0)
ans = 1×0 empty double row vector
find([-1 -1 -1 -1 -1 -1].'>0)
ans = 0×1 empty double column vector
find([-1 -1]>0)
ans = 1×0 empty double row vector
find([-1 -1].'>0)
ans = 0×1 empty double column vector
find([-1]>0)
ans = []
size(ans)
ans = 1×2
0 0
So when there is 1 row, the result has 0 columns. When there is 1 column, the result has 0 rows. When there is 1 row and 1 column (scalar), the result has 0 rows and 0 columns.
##### 2 CommentsShowHide 1 older comment
Walter Roberson on 26 Aug 2021
There are no options to find() that can make that behaviour happen. You can, however, do
idx = find([-1]>0);
if isempty(idx); idx = zeros(1,0); end

Awais Saeed on 26 Aug 2021
Edited: Awais Saeed on 26 Aug 2021
This command is for vectors and matrices. find(X > 0) returns the indices of the array X where elements are greater than zero. If none is found, it returns an empty matrix. Now using this command on scalers ( [-1] in your case) does not make any sense.
However, if you want 1×0 empty double row vector then you have to check whether X is a scaler or not. If X is a scaler, then do
X = -1:-2 % this will be an empty vector and will give you 1×0 empty double row vector
Use
isscalar()
yo check if X is a scaler ot not
Walter Roberson on 26 Aug 2021
x = [-1]
x = -1
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
result = 1×0 empty double row vector
x = [+1]
x = 1
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
result = 1×0 empty double row vector
x = [-inf]
x = -Inf
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
result = NaN
In that second case, result should not be empty. In the third case, result should be 1x0 not NaN. Your code x:x-1 is presuming an outcome and is using odd operators to try to enforce it.