레이블이 논리연산자인 게시물을 표시합니다. 모든 게시물 표시
레이블이 논리연산자인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 27일 토요일

MATLAB의 행렬 간 논리 연산과 관련 함수

 MATLAB에서 제공하는 논리 연산자는 다음 표와 같다.

[표 1] 논리 연산자
논리연산자
기능
&
AND
|
OR
~
NOT

(부연하자면 C/C++의 비트연산자와 같다. MATLAB은 비트 연산자는 없다.)
 다음 예를 보자

>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2

>> B=pascal(3)
B =
1 1 1
1 2 3
1 3 6

>> ~(A>B)
0 1 0
0 0 0
0 0 1

>> (A>2)&(B<3)
1 0 1
1 1 0
1 0 0

 이전 포스트에서 설명한 기본 논리/관계연산자 외에도 MATLAB은 추가적인 다양한 논리/관계 함수를 제공한다.

[표 2] 관계/논리 연산 관련 함수들 (X, Y는 함수)
함수명
함수의 기능
Z=xor(X,Y)
XOR 연산을 수행한다
Z=any(X)
벡터 X의 요소 중 하나라도 0이 아닌 요소가 있으면 1을 반환, X가 행렬일때는 열단위로 연산된다.
z=all(X)
벡터 X의 요소들 모두 0이 아니면 1을 반환
(X가 행렬일 때는 열단위로 연산된다.)
z=isempty(X)
행렬 X가 빈행렬이면 1을 반환
z=isequal(X,Y)
행렬 X와 Y가 완전히 동일하면 1을 반환
Z=isinf(X)
행렬 X의 요소 중 inf가 있는 곳에 1을 반환
Z=isnan(X)
행렬 X의 요소 중 nan이 있는 곳에 1을 반환
z=isreal(X)
행렬 X의 요소 중 복소수가 하나도 없으면 1을 반환

위의 도표에서 소문자 z가 출력변수이면 그 함수는 스칼라값(0혹은1)을 반환함을 의미하며 대문자 Z가 출력행렬이면 그 함수는 입력 파라메터와 동일한 크기를 갖는 행렬을 반환한다는 것을 의미한다.

 이 중 isequal()함수는 연산자 (==)와 같은 역할을 하는 것 아닌가 생각할수 있으나 (==)연산자는 요소간 비교이고 isequal()함수는 두 행렬 전체를 비교하는 함수이다. 다음 예에서 이를 확인해 보라.

>> A=[1 2;3 4]
A =
1 2
3 4

>> B=[1 2;3 4]
B =
1 2
3 4

>> C=[1 2; 3 5]
C =
1 2
3 5

>> A==B
1 1
1 1

>> A==C
1 1
1 0

>> isequal(A,B)
1

>> isequal(A,C)
0


2015년 5월 25일 월요일

파이썬의 진리값, 비교/논리 연산자

진리값

 파이썬에서 참, 거짓은 True 와 False 라는 키워드를 사용한다. (첫 글자가 대문자라는 것에 유의해야 한다.) 진리값은 자체로 변수의 값으로 사용될 수 있으며 논리 연산의 결과를 표현하는데 사용된다. 한 가지 알아둘 것은 파이썬은 False 뿐만 아니라 None, 0 (0.0, 0j, 0.0j, 0+0j 도 마찬가지), 빈 문자열(“” 혹은 ‘’),  빈 집합 ( (), {}, [] )도 False 로 간주한다는 것이다.

비교 연산자

 파이썬에는 다음과 같은 비교연산자들이 있다.

[표 1] 파이썬의 비교 연산자들
연산자
의미
x < y
x보다 y가 크면 True
x <= y
x보다 y가 크거나 같다면 True
x > y
x보다 y가 작으면 True
x >= y
x보다 y가 작거나 같다면 True
x == y
x와 y가 같다면 True
x != y
x와 y가 다르다면 True
x is y
동일한 객체인지를 판별 (x와 y가 같은 참조인지 판별)
x is not y
is 의 부정형 (x와 y가 다른 참조인지 판별)

연산자 ‘==’와 ‘!=’은 객체의 내용(content)를 직접 비교하여 참/거짓을 판별한다. 객체의 형(type)이 다르면 두 객체는 항상 다르다. 단, 숫자형인 경우 int, float, complex 간에도 실제로 같은 숫자라면 같다. 즉, 1 (int형), 1.0 (float형), 1+0j (complex형), 1.0+0j (complex형), 1.0+0.0j (complex형) 는 모두 같은 숫자로 판별된다.

>>> sa = 'hello everybody'   
>>> sb = 'hello everybody'
>>> sa == sb
True

반면 연산자 is 는 두 객체가 동일한 참조(주소)를 가지고 있는 지를 판별하는 것이다. 만약 id(x)와 id(y)가  같다면 x is y 는 True값을 가진다.

>>> sa='hello everybody'   
>>> sb='hello everybody'
>>> sa is sb
False

>>> x=[1,2]
>>> y=[1,2]
>>> x==y
True
>>> x is y
False
>>> z=x
>>> z is x
True

논리 연산자

 논리 연산자는 조건식들끼리 묶는 역할을 한다.

[표 2] 파이썬의 논리 연산자들
연산자
기능
x and y
x와 y 둘 다 True 일 때 True 그 외는 False
x or y
x와 y 둘 다 False 일 때 False 그 외는 True
not x
x가 True 일 때 False

이와 같이 파이썬의 논리 연산자는 다른 언어들과는 달리 자연어(and, or, not)을 사용한다.


2015년 5월 19일 화요일

C/C++의 논리 연산자

 논리 연산자는 다수의 조건식을 논리식으로 연결하는 연산자이고 두 개의 피연산자를 필요로 하는 이항 연산자이다. C/C++ 논리 연산자는 다음과 같은 것들이 있다.

[표 1] 논리 연산자.
논리연산자
의미
사용 예
&&
AND
i>80 && i<90
||
OR
i>10 || i<20
!
NOT
!(i<10)
논리 연산자에서 NOT의 의미인 ‘!’ 연산자는 관계 연산자의 ‘같지 않다’인 ‘!=’와 비슷하다. 그래서 초보자들은 가끔 혼동하는 경우가 있으니 주의해야 한다.

 정수형 변수 ‘ia가 0보다 크고 10보다 작다’ 라는 논리식은 다음과 같이 ‘0보다 크다’와 ‘10보다 작다’ 라는 논리식을 and로 묶어야 한다.

0 < ia  && ia < 10

세 개 이상의 조건문도 논리 연산자로 묶을 수 있다. ‘문자형 변수 ca가 ‘a’ 이거나 ‘b’ 혹은 ‘c’이다’라는 논리식을 다음과 같이 or로 묶어야 한다.

ca == ‘a’ || ca == ‘b’ || ca == ’c’

다음 논리식은 ! 연산자를 이용한 예이다.

!(ia>0) // ia<=0과 같다.
!(ca == ‘a’ || ca == ‘b’) // (ca != ‘a’ && ca != ‘b’) 과 같다.

 논리 연산자는 관계 연산자와 마찬가지로 내부적으로 참(true), 거짓(false)의 값을 가진다. &&는 양쪽 조건식이 모두 참일 때 전체 조건식이 참이 되며 ||는 양쪽 조건식 중 하나 이상이 참일 때 전체 조건식이 참이 된다. !은 참은 거짓으로, 거짓은 참으로 논리값을 바꿔준다.
 실습으로 어떤 short형 변수 값이 양의 짝수인지를 판별하고 어떤 실수형 변수가 1보다 크거나 –1보다 작은지를 검사하는 프로그램을 작성해보자.
#include <stdio.h>
int main(void) {
    short sA = 10;
    float fX = 2.0f;
    if ( sA>0 && sA%2 == 0 )
        printf("sA is a positive even number.\n");
    if ( fX<-1 || fX>1 )
        printf("|fA|<1.\n");
}

이것을 실행하면 첫 번째 printf()문만 수행될 것이다.