본문 바로가기

분류 전체보기640

10-5장 문자열과 포인터 문자열 배열에 문자열  char s[] = "HelloWorld";//요소 변경 가능 Os[1] = 'E'; // HElloWorld//할당 연산자 사용 불가능 Xs = "HelloWorld_2"; //오류 위의 코드처럼 요소는 변경 가능하지만 할당 연산자로 문자열 자체를 변경하는 건 안된다.  포인터에 문자열: 문장이 변하지 않음이 보장되는 경우에 사용한다.  char* p = "HelloWorld";//할당 연산자 사용 가능 Op = "HelloWorld_2"; // HelloWorld_2//요소 변경 불가능 Xp[1] = 'E'; //오류위의 코드처럼 할당 연산자로 문자열이 가리키는 주소의 값(즉, 문자열 자체)은 변경할 수 있지만, 문자를 변경하는건 안된다. 2024. 11. 5.
윈폼 블로그 https://andjjip.tistory.com/category/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B3%BC%EC%A0%95%EC%A4%80%EB%B9%84/WinForm 2024. 11. 4.
10-4장 문자열을 수치로 변환 atoi(문자열): 특정 숫자 형태의 문자열을 정수로 변경해주는 것  sscanf(문자열, "%d", 정수형 변수) ⭐️⭐️⭐️: 특정 숫자 형태의 문자열을 정수형 변수에 저장해주는것  sprintf(문자열 변수, "%d", 정수) ⭐️⭐️⭐️: 특정 숫자를 문자열 변수에 저장해주는 것  #include #include int main(){ char s[] = "100"; char t[100] = ""; int i; printf("%d\n", atoi("100")); sscanf(s, "%d", &i); //문자열을 정수로 변경해서 저장 sprintf(t, "%d", 102); //정수를 문자열로 변경해서 저장 printf("i: %d\n", i); //i: 100 .. 2024. 11. 4.
10-3장 문자열 처리 라이브러리 strlen(s): 문자열의 길이#include #include int main(){ char s[] = "abcdefgh"; int len = strlen(s); printf("문자열 %s의 길이 = %d", s, len); //문자열 abcdefgh의 길이 = 8} strcpy(s1, s2): 문자열을 복사#include #include int main(){ char src[] = "Hello"; char dst[6]; strcpy(dst, src); printf("복사된 문자열 = %s", dst); //복사된 문자열 = Hello}  strcat(s1, s2): 문자열을 연결#include #include int main(){ char s[11.. 2024. 11. 4.
10-2장 문자 입출력과 문자열 입출력 1. 문자 입출력[getchar()와 getch()]getchar(): 입력된 문자들이 buffer에 쌓이다가, enter 키가 입력되면 buffer에 저장되어 있던 문자들이 선입선출형식으로 하나씩 출력된다. getch(): 입력된 문자들이 바로바로 출력된다.  [putchar()와 putch()]putchar(): 출력 버퍼를 사용하여 여러 문자를 모았다가 한번에 문자들을 출력한다.putch(): 버퍼 없이 바로바로 출력한다.    2. 문자열 입출력[scanf()와 gets_s()]scanf(): 문자열을 읽어서 배열 s[]에 저장한다. 단! space, tab, newline과 같은 입력을 구분하는 문자들은 입력되지 않는다.gets(문자열, 문자열 길이): 문자열을 읽어서 배열 s[]에 저장한다. .. 2024. 11. 4.
10-1장 문자열과 NULL 문자 1. 문자열 표현 방법#includeint main(){ char str[6] = "Hello"; //동일한 기능 - char str[6] = {'H', 'e', 'l', 'l', 'o'};}   각 배열은 문자가 각각 입력되지만 아스키 코드로도 확인할 수 있다.#includeint main(){ char str[6] = "Hello"; printf("%c", str[0]); // 'H' printf("%d", str[0]); // 72}  2. NULL 문자: 문자열이 끝나기 전에 반드시 NULL 문자(\0)라는 특수한 값으로 끝나야한다. 문자열의 크기가 5개라도 NULL문자를 생각해서 크기를 6개로 설정해야한다.  char str[6] = "Hello";  ❓ 왜 N.. 2024. 11. 4.
Lecture 16: Adversarial Examples and Adversarial Training 1. Adversarial Examples란?: 모델이 잘못된 예측하도록 만드는 입력데이터이다. 인간이 보기에는 원본과 거의 동일하지만 딥러닝 모델에는 오해를 유발하는 노이즈를 포함하고 있어 모델을 속일 수가 있다. 예를 들면 배사진에 모델이 강아지의 특징이라고 생각하는 특징의 노이즈를 추가하면 배를 보고 강아지라고 분류한다. 위 사진은 원래 서로 다른 카테고리에 속하는 4개의 이미지들이지만 노이즈를 추가해서 4개의 이미지를 모두 비행기로 인식하게된 사례이다.   2. Adversarial Examples가 발생하는 이유  과적합딥러닝 모델이 Adversarial Examples에 취약한 이유는 과적합으로 인해 데이터 간 거리가 좁아져 모델이 작은 노이즈에도 크게 반응하는 특성이 있다. Adversari.. 2024. 11. 1.
Lecture 15: Efficient Methods and Hardware for Deep Learning 딥러닝 모델의 증가에 따른 문제점 1. Model size : 모바일 환경에서 모델이 클수록 데이터 전송 및 업데이트가 어려워지며, 많은 메모리를 차지하여 배터리 소모가 증가한다.  2. Speed: 대규모 모델을 학습하고 추론하는데 시간이 오래걸려서 연구자와 개발자의 생산성을 저하시킨다.  3. Energy Efficient: 딥러닝 에너지 소모는 대부분 메모리 접근에서 발생하며, 대형 모델일수록 더 많은 에너지가 필요하다.    Algorithm-Hardware Co-Design(효율적인 딥러닝을 위한 방법)앞선 문제들을 해결하기 위해서 알고리즘이나 하드웨어를 변경할 필요가 있다.  Algorithm-Hardware Co-Design은 딥러닝의 연산 효율을 개선하기 위해 알고리즘과 하드웨어의 특성을 .. 2024. 11. 1.
Lecture 14: Deep Reinforcement Learning 1. Reinforcement Learning(강화 학습): 컴퓨터나 로봇이 어떤 환경(Environmnet)에서 반복적인 행동을 통해 목표를 달성할 때 가장 좋은 행동 방식을 찾는 방법이다.  우선 강화학습을 알기전에 Agent와 Environment, State에 대해서 학습해야한다.Agent: 학습을 통해 환경에서 최적의 행동을 찾으려고 하는 주체이다. 예를 들면, 미로를 빠려 나오려는 로봇 Environment: Agent가 행동을 할 때 변화를 일으키는 외부 요소이다. 예를 들면, 미로에서 벽과 출구가 있는 공간 자체 State: Agent가 현재 환경에서 어떤 상황에 처해 있는지를 나타내는 정보  1. Environment는 Agent에게 State를 부여한다. 2. 전달된 State에 따라서.. 2024. 11. 1.
Lecture 13: Generative Models 1. 지도 학습(Supervised Learning)과 비지도 학습(Unsupervised Learning) 지도 학습(Supervised Learning): 데이터 x와 라벨 y가 한 쌍으로 주어지며, 모델이 x를 입력 받아 y로 매핑하는 함수(F(x) ➡️ y)를 학습한다.   분류(Classification): 이미지를 입력으로 받으면 그 이미지가 어떤 카테고리에 속하는지 예측 회귀(Regression): 입력값에 따른 연속적인 출력을 예측하는 문제. 예를 들어 주식 가격 예측 객체 탐지(Object Detection): 이미지 내의 여러 객체를 찾아내고, 각 객체의 종류와 위치를 예측하는 작업 이미지 캡셔닝(Image Captioning): 이미지 속 상황을 설명하는 문장을 생성하는 작업  비지도.. 2024. 11. 1.
9주차 - split, apply, pivot table을 이용해서 실습해보기 초반에는 모든 사전 자료형을 열거해서 데이터 프레임을 만들었지만, 사전자료형의 하나의 키에 여러 값을 리스트로 추가해서 데이터 프레임을 만드면 추후 행을 추가할 때 각 리스트의 요소들만 추가하면 되기 때문에 아래의 방식이 더 개선된 방식이다.  9.1은 split을 통해 구분된 데이터들을 기반으로 apply로 연산을 하는 것이 주요 포인트이다.    내가 한 방식은 특정 열의 행 값에 따라서 값을 부여해주었다.  하지만, 교수님은 Product로 행을 만들어주고 groupby(category_mapping)에서 category_mapping을 전달하면 pandas는 인덱스의 각 값에 대해 category_mapping 딕셔너리를 참조하여 자동으로 새로운 카테고리 값으로 매핑을 수행합니다. 따라서 그렇게 .. 2024. 10. 31.
Scaffold vs Surface의 차이 우리가 이전에 MainActivity.kt에서 onCreate()메서드에 Scaffold를 봤을 것이다. 이 Scaffold외에 Surface도 있다.  Scaffold: 전체화면의 주요 UI 컴포넌트를 배치할 수 있는 프레임워크를 제공하여 앱의 구조를 쉽게 설정할 수 있다. 주로, 앱의 메인 레이아웃을 설정할 때 사용된다.  예를 들어 상단 bar, 하단 navigation bar, floating action button을 포함한 화면을 구성할 때 유용하다.   위의 형태로 topBar, bottomBar, flaotingActionButton, Content 등을 구성할 수 있다.   Surface: 개별 UI 컴포넌트의 스타일과 배경을 설정하는데 사용되는 기본 구성요소이다. 주로 카드, 버튼, 박.. 2024. 10. 30.
Compose 기초 기본적으로 프로젝트를 생성하고 MainActivity.kt를 열어보면 위와 같은 파일 형태가 나온다.  "onCreate() {}": 애뮬레이터의 화면 레이아웃을 담당한다. (여기서 아무리 코드를 바꿔도 Preview에서는 반영되지 않는다.)  "@Composablefunc Greeting(...) { }": View의 구성을 담당한다.  "@Preview(...)@Composablefunc GreetingPreview() {...}": Preview 화면의 레이아웃을 담당한다. (여기서 아무리 바꿔도 실제 애뮬레이터에서는 반영되지 않는다.)  "onCreate메소드" override fun onCreate(savedInstanceState: Bundle?) { //시뮬레이터 용 super.onCr.. 2024. 10. 30.
[pandas] Pivot Tables Pivot Tables: 특정 행과 열을 기준으로 우리가 원하는 연산을 하는 것이다. 자세하게 말하면, 데이터를 요약하고 집계하기 위해 특정 행과 열을 기준으로 그룹화해서 다양한 연산(합, 평균, 개수)을 수행하는 테이블이다. 데이터 프레임 명.pivot_table(연산할 컬럼, index=기준이 되는 행, columns=기준이 되는 열)  이렇게 pivot table을 이용하면, 간단하게 행과 열을 기준으로 특정 값에 대한 연산을 할 수 있다. pivot table의 기본 연산은 mean이기 때문에 아무 코드 추가 없이도 생존자 여부의 평균을 계산할 수 있다.  각각에 다른 연산 적용 또한 같은 기준에 각각의 값에 다른 연산을 적용할 수도 있다.  정한 기준에 대한 전체에 대한 연산 적용 이렇게 ma.. 2024. 10. 29.
[pandas] GroupBy: Apply 이전에 배웠던 기준에 따라 선택된 데이터들끼리 연산하는 것이 Apply이다.   Aggregation: sum, median, max, min 같이 값들을 하나로 요약하는 과정이다.   이런 식으로 aggregate와 함께 연산을 써주면, key로 분류된 데이터들 각각에 min, medianm, max 연산을 해주고 그 결과를 보여준다. 이렇게 모든 열(data1, data2)에 같은 연산을 한번에 할 수도 있지만, 각 열에 다른 연산도 가능하다.  이렇게 data1에는 min연산을하고, data2에는 max연산을 해줄 수도 있다.     Filter: 그룹을 기준으로 특정 조건에 맞는 데이터만 남기는 과정이다. 예들 들면 그룹 별 평균이 특정 값 이상인 데이터만 남기는 것 왜 groupby된 데이터 .. 2024. 10. 29.
[pandas] GroupBy: Split ❓ Split이란?: 데이터 중 내가 원하는 기준에 있는 일부 데이터를 선택하는 것이다.      기존 값을 기준으로 split이런 식의 데이터가 있을 때, key를 기준으로 split을 한다면 아래와 같이 같은 키를 가진 행끼리 나누어 진다.keydataA0A3 keydataB1B4 keydataC2C5    사용자가 정의한 값을 기준으로 split기존에는 열중 하나의 값으로 겹치는 행끼리 split을 했다. 하지만 사용자가 직접 정의한 값을 기준으로 split을 할 수 있다. 위의 데이터가 있을 때 직접 정의한 L을 기준으로 값을 나눌 수 있다.  0은 0끼리, 1은 1끼리, 2는 2끼리 나눌 수 있다. [0인 것들]keydata1data2A05C23C59[1인 것들]keydata1data2B10A3.. 2024. 10. 29.
9-7장 이중 포인터 이중 포인터: 포인터를 가르키는 포인터이다. 즉, 주소를 갖고 있는 메모리의 주소를 갖고있는 메모리를 의미한다.  #includeint main(){ int a = 3; int* p = &a; int** pp = &p; printf("%d\n", *p); //3 printf("%d\n", **pp); //3 } 이처럼 pp가 이중 포인터이다. a의 주소를 담고 있는 p의 주소를 담고 있는 pp이다. 따라서, 간접 참조 연산자를 2개 써줘야하는데, **pp는 pp의 값을 접근하고, 다시 그 값은 주소이니깐 그 주소의 값을 접근하는 형태이다.  [예제]#includeint globlal_value = 30;void call_by_value(int* val){ //매개변수가 포.. 2024. 10. 29.
9-6장 함수 포인터 함수 포인터: 함수 포인터란, 함수를 가르키는 포인터이다. 즉 함수의 주소를 가질 수 있다. [형식]반환형 (* 함수 포인터 이름)(매개 변수1, 매개 변수2, ...);//예시int (*pf)(int, int); 함수 포인터는 따로 body가 필요하지 않다.또한 배열처럼 함수 이름 자체가 주소이기 때문에 주소 연산(&)는 필요하지 않다.  [예시 - 1]#includevoid A(){ printf("A입니다.");}void B(){ printf("B입니다.");}void C(){ printf("C입니다.");}int main(){ int x = 0; void(*p)(); printf("함수 명을 선택하시오. (A: 0, B: 1, C: 0): "); scanf("%.. 2024. 10. 29.
9-5장 함수가 포인터를 반환하는 경우 함수가 포인터를 반환하는 경우: 함수 종료시에도 남아 있는 변수의 주소를 반환해야한다. 만일 지역 변수의 주소를 반환한다면 함수가 종료되면 소멸되므로, 오류가 발생할 수 있다. [지역 변수]#include//결과를 result 저장하고 그 주소를 반환int* add(int x, int y){ int result; result = x + y; return &result;}int main(){ int* p = add(3, 4); printf("%d", *p); //오류 발생}  [전역 변수]#include//결과를 result 저장하고 그 주소를 반환int result;int* add(int x, int y){ result = x + y; return &result;}i.. 2024. 10. 29.
9-4장 배열과 포인터 배열의 이름이 바로 포인터이다. 즉, 배열은 따로 주소가 없이 배열 이름자체가 주소이다.   #includeint main(){ int a[] = {10, 20, 30, 40, 50}; printf("배열의 이름 = %u\n", a); // 배열의 이름 = 1868132144 printf("첫 번째 원소의 주소 = %u\n", &a[0]); // 첫 번째 원소의 주소 = 1868132144}   따라서, 포인터도 배열처럼 사용할 수 있다. #includeint main(){ int a[] = {10, 20, 30, 40, 50}; int *p; p=a; printf("a의 첫 번째 원소 = %u\n", a[0]); // 10 printf("p의 첫.. 2024. 10. 28.
9-3장 포인터와 함수 함수 호출 시 인수 전달 방법1. 값에 의한 호출: 인수의 값이 매개 변수로 복사된다. 따라서 함수가 종료되면 매개 변수의 값은 사라진다. 즉, 실제 인자들의 값은 유지됨. 2. 참조에 의한 호출: 인수의 주소가 매개 변수로 복사된다. 따라서 함수에서 인자로 받은 주소를 이용해서 값을 변경하면 실제 인자들의 변수 값도 변경된다. 포인터 사용시 주의할 점🚨 초기화가 안된 포인터를 사용하면 안된다.🚨 초기화 되지 않은 포인터 변수에 값을 넣으면 그 포인터가 어느 곳에 있는지 모르기 때문에 해당 포인터가 프로그램에서 중요한 연산에 있는 메모리를 할당하고 있는 상황에서 값을 넣으면 프로그램이 망가질 수 있기 때문에 주의해야한다. 🚨 포인터가 아무것도 가리키고 있지 않은 경우에는 NULL로 초기화해야 한다.🚨 예.. 2024. 10. 28.
9-2장 포인터의 연산 포인터연산에는 증가(++), 감소(--), 덧셈(+), 뺄셈(-) 연산이 있다. 증감 연산의 경우 포인터가 가르키는 객체의 크기가 1의 의미를 가지게 된다.   int x = 10; int *p = &x; //1000++p; //1000 + sizeof(int) = 1004    포인터의 증감 연산    간접 참조 연산자와 증감 연산자 2024. 10. 28.
9-1장 포인터란? ❓포인터란?: 주소 그 자체이다. 즉, 메모리의 주소이다. ❓포인터 변수란?: 메모리의 주소를 가지고 있는 변수를 의미한다.  메모리: 변수가 저장되는 공간을 의미한다. 메모리는 byte 단위로 접근할 수 있다.  메모리에는 데이터 영역, Heap 영역, Stack영역이 있다.   데이터 영역: 전역 변수 및 static 변수가 할당되는 영역 (프로그램의 시작 시 할당되어 종료 시 소멸된다.) Heap영역: 프로그래머가 할당하는 영역(프로그래머가 명시적으로 할당하고 소멸시킨다.)  Stack 영역: 함수 호출 시 생성되는 지역 변수 및 매개 변수가 저장되는 영역( 함수 호출이 완료되면 소멸된다.)     자료형 별 메모리에 저장되는 형식int main(void){ int i = 10; char.. 2024. 10. 28.
cs231n - lecture11(CNNs in practice) Data Augmentation (데이터 증강): 원본 이미지를 변형하는 과정을 추가하여, 모델의 성능을 증가시키는 방법이다. 즉, label을 변하지 않고 label의 pixel의 값을 여러 형태로 변형 시켜 모델을 학습시키는 것이다. Horizontal flips(수평 뒤집기): 이미지 좌우를 뒤집는 간단한 방식  Random crops / scalse(무작위 자르기 및 크기 조정): 이미지를 무작위로 자른 후 일정한 크기로 맞추는 방식 ResNet에서는 아래와 같은 방식을 사용했다. [이미지 생성]1. [256, 480] 사이의 하나의 수를 골라 이를 L이라고 한다. (이 때, L은 width와 height 둘 중 하나로, 더 짧은 쪽의 길이를 의미한다.) 2. 학습시킬 이미지를 이 L을 기준으로 .. 2024. 10. 27.
5.10 Design of accumulator logic 해당 부분을 확대해보면 아래와 같다.  자, 이제 이전에 설계했던 방식대로 " AC ← ? " 형태인 수식을 모두 가져와서 분류하는 작업을 해보자.   이렇게 분류된 것을 바탕으로 논리 회로를 설계해보면 아래와 같다.  위의 식은 식의 왼쪽 조건의 경우만 따져서 만든 논리 회로이기 때문에 정확한 설계가 아니다. 따라서 AND와 ADD 다양한 연산을 신제 피연산자와 만든 논리 회로는 아래의 사진과 같다. 2024. 10. 27.
5.9 Design of basic computer 1. 기본적인 컴퓨터의 구성요소     2. Register의 LD, INR, CLR 설계AR의 LD, INR, CLRAR을 변경한다는 것은 " AR ← ? " 형태의 모든 수식들이다. 따라서, 이전에 배웠던 " AR ← ? " 형태를 모두 가져와보면 아래와 같다.  이렇게 "AR ← ?" 가져왔을 때 상위 3개는 Load에 관한 내용이고, RT₀은 Clear에 관한 내용, D₅T₄ 는 Increment에 관한 내용이라는 것을 알수 있다.  그래서 분류를 해보면 위의 사진과 같고 이를 논리 게이트로 표현해보자.   이런식으로 해당 레지스터를 변경시키는 모든 수식을 가져오고 그 변경된 값을 LD, INR, CLR로 분리하여 논리 게이트를 만들 수 있다.    3. Memory의 Read 설계 Memory를.. 2024. 10. 27.
5.8 Complete computer description 전체적인 Flowchart   전체적인 Functions 이표를 보고 외우는 것은 어렵지만, 이 표를 보고 어떤 동작인지, 각각의 변수들의 의미하는 것이 무엇인지는 알아야한다. 2024. 10. 27.
5.7 Input-output and interrupt 1. 기존의 방식(비효율적인 방법)   AC, INPR, OUTR의 기본 역할 AC(누산기): 16bit 크기의 레지스터로, 컴퓨터의 계산과 명령어 수행중 발생하는 중간 결과를 일시적으로 저장하는 역할을 한다. INPR(입력 레지스터): 8bit 크기의 레지스터로, 키보드에서 입력된 데이터를 잠시 보관해두는 공간이다. OUTP(출력 레지스터): 8bit 크기의 레지스터로, 프린터로 데이터를 보내기 전에 일시적으로 데이터를 저장하는 공간이다.    FGI와 FGO 플래그의 역할 FGI(Input Flag): 키보드로부터 입력이 완료되었을 때 1로 설정한다. FGI가 1이 되면 컴퓨터는 입력된 데이터를 처리할 준비가 되었다는 신호로 인식한다. FGO(Output Flag): 프린터로 데이터를 보낼 준비가 되.. 2024. 10. 27.
5.6 Memory reference instructions Memory reference instructions란?  위 format에서 Opcode의 값이 0 0 0 ~ 1 1 0으로 명령어가 결정이 되고, I의 값이 0이면 직접 참조, 1이면 간접 참조인 Instruction이다.  AND(Opcode의 값이 0 0 0인 경우): 유효 주소가 가리키고 있는 메모리의 값과 AND 연산을 한 후 AC에 저장하는 것 Opcode의 값이 0 0 0 으로 동일하지만 I의 값에 따라서 16진수 표현 방식이 달라진다.즉, 간접 참조라면 1 0 0 0 x x x으로 8 x x x가 되고 직접 참조라면 0 0 0 0 x x x으로  0 x x x가 된다.      ADD(Opcode의 값이 0 0 1인 경우): 유효 주소가 가리키고 있는 메모리의 값과 ADD 연산을 한 후 .. 2024. 10. 27.
5.5 Instruction cycle + Register reference instruction 하나의 Instruction(명령어)는 하나의 사이클로 이루어져있다. 하나의 사이클을 지나면서 명령어가 수행된다. 사이클의 종류    Fetch & Decode(모든 명령어에 똑같이 적용)    [T₀: AR ← PC]   [T₁ : IR ← M[AR], PC ← PC + 1]   [T₂ : D₀ ,…, D₇ ← Decode IR(12 - 14), AR ← IR(0 - 11), I ← IR(15)]   명령어 사이클의 전체적인 Flow chart     Register reference instruction: I가 0이고, Opcode가 1 1 1인 경우  Bⁱ는 Register operation의 12bit에서 i 번째를 제외한 나머지는 0인 것이다. 즉, B₂는 0 0 0 0 0 0 0 0 0 1 0.. 2024. 10. 27.