How to find out if a logical array is all zeros?

I have a logical array that is 100x1 logical. sometimes it contains a mix of numbers and sometimes it contains all 0s.
How would i go about making an if statement that checks to see if all 100x1 is 0s and if all 0s = do something
I thought i was correct in using any command but im not sure that works correctly for me..
Thanks!

 Respuesta aceptada

John D'Errico
John D'Errico el 3 de Feb. de 2022
Editada: John D'Errico el 3 de Feb. de 2022
any does work, with a slight tweak. But you could also use all, or sum, or nnz, or even find. There are certainly many ways.
if ~any(X)
...
end
if all(~X)
...
end
if sum(x) == 0
...
end
if numel(find(x)) == 0
...
end
if nnz(x) == 0
...
end
Any of those tools would suffice.

3 comentarios

In general the most efficient approach is likely to be ~any(X):
X = false(1,1e7);
X([1e3,end]) = true;
timeit(@()~any(X))
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 1.8459e-07
timeit(@()all(~X))
ans = 0.0010
timeit(@()sum(X)==0)
ans = 0.0011
timeit(@()numel(find(X))==0)
ans = 0.0089
timeit(@()nnz(X)==0)
ans = 6.8383e-04
Note that any( ) is possibly written to short-circuit in the background, as these timings suggest:
x = false(1,100000000);
y = x;
x(end) = true; % last element is true
y(1) = true; % first element is true
timeit(@()~any(x)) % has to examine all of the elements to find the true one?
ans = 0.0230
timeit(@()~any(y)) % once first element is examined the answer is known
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
No, it is just very fast at checking from the beginning of the array.
Some of my tests on y show times on the order of 1e-9 instead of 0, by the way.
x = false(1,100000000);
y = x;
x(end) = true; % last element is true
y(1) = true; % first element is true
timeit(@()~any(x)) % has to examine all of the elements to find the true one?
ans = 0.0234
timeit(@()~any(y)) % once first element is examined the answer is known
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
timeit(@()~any(y)) % once first element is examined the answer is known
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
y(5000) = true;
timeit(@()~any(y)) % has to examine all of the elements to find the true one?
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
timeit(@()~any(y)) % once first element is examined the answer is known
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
timeit(@()~any(y)) % once first element is examined the answer is known
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
y(1) = true;
timeit(@()~any(y))
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
timeit(@()~any(y))
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
timeit(@()~any(y))
Warning: The measured time for F may be inaccurate because it is running too fast. Try measuring something that takes longer.
ans = 0
y(1) = false;
timeit(@()~any(y)) % once first element is examined the answer is known
ans = 1.0476e-06
timeit(@()~any(y)) % once first element is examined the answer is known
ans = 1.0646e-06
timeit(@()~any(y)) % once first element is examined the answer is known
ans = 1.0516e-06

Iniciar sesión para comentar.

Más respuestas (4)

William Rose
William Rose el 3 de Feb. de 2022

2 votos

If A is a vector,
sum(abs(A))
will be zero, or not, of all the elements are zero, or not.
If A is a 2D array, do
sum(sum(abs(A)))
For a vector, all with one input will work.
x = ones(10, 1);
all(x > 0) % true
ans = logical
1
For a non-vector array you probably want to specify a dimension. In recent releases, you can specify a vector of dimensions on which to operate or you can specify 'all' as the dimension to operate on all the dimensions no matter how many there are.
x = ones(10, 10);
all(x > 0) % Only operate on dimension 1
ans = 1×10 logical array
1 1 1 1 1 1 1 1 1 1
all(x > 0, 'all') % Operate on dimensions 1 and 2
ans = logical
1
x = ones(10, 10, 10);
all(x > 0, [1 3]) % Operate on dimensions 1 and 3
ans = 1×10 logical array
1 1 1 1 1 1 1 1 1 1
all(x > 0, 'all') % Operate on dimensions 1, 2, and 3
ans = logical
1

1 comentario

MKM
MKM el 4 de Feb. de 2022
This is great! Thanks for taking the time to help me with this.

Iniciar sesión para comentar.

Categorías

Productos

Versión

R2021b

Preguntada:

MKM
el 3 de Feb. de 2022

Comentada:

el 15 de En. de 2025

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by