Find returns empty with inconsistent size
11 ビュー (過去 30 日間)
古いコメントを表示
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?
0 件のコメント
採用された回答
Walter Roberson
2021 年 8 月 26 日
編集済み: Walter Roberson
2021 年 8 月 26 日
find([-1 -1 -1 -1 -1 -1]>0)
find([-1 -1 -1 -1 -1 -1].'>0)
find([-1 -1]>0)
find([-1 -1].'>0)
find([-1]>0)
size(ans)
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 件のコメント
Walter Roberson
2021 年 8 月 26 日
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
その他の回答 (1 件)
Awais Saeed
2021 年 8 月 26 日
編集済み: Awais Saeed
2021 年 8 月 26 日
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
3 件のコメント
Awais Saeed
2021 年 8 月 26 日
編集済み: Awais Saeed
2021 年 8 月 26 日
No there is not. To get 1x0 empty double row for scaler values, just check if they are scalers or not. If they are, then by doing
j : k % where j > k, will give you 1x0 empty double row vector
Here is how you do it
x = [-1 -1 -1 -1 -1 -1]; % check with x = 0; x = -1 etc. as well
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
What Walter Roberson suggested will also work for you.
Walter Roberson
2021 年 8 月 26 日
x = [-1]
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
x = [+1]
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
x = [-inf]
if (isscalar(x))
result = x : x - 1
else
result = find(x>0)
end
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.
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!