Extracting only real numbers from a vector containing both real and complex values
조회 수: 218 (최근 30일)
이전 댓글 표시
Hi, I have a matrix that contains both real and complex elements in it. How can I transfer all the real elements (NOT the real parts of all elements) to another matrix?
For example:
My orginal matrix is A:
A = [ -0.4406 - 1.5696i , -0.4406 + 1.5696i, 1.8812 + 0.0000i]
Here we see that A has 3 elements, the first two of which are complex while the third element is real. How do I write code that extracts only the real element ie, the third element (1.8812)?
I do NOT want to extract the real parts of all three variables.
댓글 수: 0
채택된 답변
Daniele Mascali
2021년 3월 19일
Try this:
real(A(imag(A) == 0))
댓글 수: 2
Rik
2021년 3월 19일
If you run into any issues with float rounding errors:
A = [ -0.4406 - 1.5696i , -0.4406 + 1.5696i, 1.8812 + 0.0000i];
A(4)= 1 + 1i*(sqrt(2)^2-2); % imaginary part should be 0 but isn't quite
B1=real(A(imag(A) == 0));
B2=real(A(abs(imag(A))<(10*eps)));
disp(A),disp(B1),disp(B2)
Mathieu NOE
2021년 3월 19일
that's why I suggested to make a test with a given tolerance and not exact zero match with risks of wrong answer due to rounding errors
추가 답변 (2개)
Mathieu NOE
2021년 3월 19일
hello
see code below :
A = [ -0.4406 - 1.5696i , -0.4406 + 1.5696i, 1.8812 + 0.0000i];
tol = eps;
ind = find(abs(imag(A))<tol);
B = A(ind);
Ahmadreza Torabi
2021년 12월 15일
편집: Ahmadreza Torabi
2021년 12월 15일
Hello
You can use something like this:
A = [1 2 7+i 3 8+i 4 9+i 5 6];
m = 1;
n = length(A);
for k = 1:n
if isreal(A(k))
B(m) = A(k);
m = m+1;
end
end
B
Then B is just include real numbers of A.
댓글 수: 1
Rik
2021년 12월 15일
This will dynamically grow the array. It is better to create a logical vector of the same size as A where you mark wether it should be removed. Then you only need to modify the B once: when you create it.
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!