Check if element in array are square of each other

7 visualizaciones (últimos 30 días)
am
am el 22 de Mzo. de 2019
Respondida: Agam Sharma el 8 de Jun. de 2022
Hello,
I have a problem where I have to find possible squares in an array. For example [7 5 49] or [49 5 7] is true since 7 squared is 49, but [11 13 25] should return false.
Is there a way to do it better than a nested loop?
Thank you!
function y = isItSquared(x)
y = false;
for i = 1:length(x)
for j = i+1:length(x)
if x(i)^2 == x(j) || x(i) == x(j)^2
y = true
break
end
end
end

Respuesta aceptada

Mark Sherstan
Mark Sherstan el 22 de Mzo. de 2019
You can get rid of one of the for loops:
function y = isItSquared(x)
y = false;
xSquare = x.^2;
for ii = 1:length(x)
if (sum(x(ii) == xSquare) ~= 0)
y = true;
return
end
end
  4 comentarios
am
am el 22 de Mzo. de 2019
So if xSquare has no index, it means that the whole array is checked?
sum(x(ii) == xSquare) ~= 0
Mark Sherstan
Mark Sherstan el 22 de Mzo. de 2019
Correct, it is a boolean check returning an array of 1's or 0's.

Iniciar sesión para comentar.

Más respuestas (4)

madhan ravi
madhan ravi el 22 de Mzo. de 2019
nnz(V.^2==V.')>=1 % where V your vector, result 0 means false, 1 means true
  5 comentarios
madhan ravi
madhan ravi el 22 de Mzo. de 2019
Editada: madhan ravi el 22 de Mzo. de 2019
@eq means equal ,see https://in.mathworks.com/help/matlab/ref/bsxfun.html for further explanation.
https://in.mathworks.com/help/matlab/ref/nnz.html - nnz() gives you the total number of non-zero elements.
>= means if you have one or more then set it to true.
So what happens is each element of the vector is compared with the square of each element , so if atleast a single match is found then the answer returned is 1 meaning true.
am
am el 22 de Mzo. de 2019
I think it was a fantastic answer as well, thank you!

Iniciar sesión para comentar.


Steven Lord
Steven Lord el 22 de Mzo. de 2019
I would probably do this using some subset of the ismember, any, sum, all, and/or isequal functions. Read through the help text and see if you can think of a way to use some of those functions to accomplish that task.

KSSV
KSSV el 22 de Mzo. de 2019
a = [7 5 49] ;
b = [49 5 7] ;
idx = a.^2==b
In idx if 1 , true, if zero false.
  1 comentario
am
am el 22 de Mzo. de 2019
Hello,
There is only one array being fed to the function.

Iniciar sesión para comentar.


Agam Sharma
Agam Sharma el 8 de Jun. de 2022
function b = isItSquared(a)
b=false;
c=a.^2; %creating another array containing respective squares in 'a'
for i=1:length(c)
if(ismember(c(i),a)) %check if square is present in a itself
b=true;
end
end
end

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by