22_상반기_matlab_기초
기본 연산 함수
>> rem(5,3) %나머지 함수
ans =
2
>> rem(5,5)
ans =
0
>> sign(-1)
ans =
-1
>> sign(-2)
ans =
-1
>> sign(5)
ans =
1
>> (floor(x/5) + sign(rem(x,5))) * (floor(y/5) +sign(rem(y,5)))
ans =
3266
---
>> a=[1 2 3 4 5 6]
a =
1 2 3 4 5 6
>> a=1:6
a =
1 2 3 4 5 6
>> a=[1:5]
a =
1 2 3 4 5
>> b=[4:11
b=[4:11]
>> b=4:11
b =
4 5 6 7 8 9 10 11
>> a=1:2:6
a =
1 3 5
>> a=4:-1:1
a =
4 3 2 1
>> b=4:-2:1
b =
4 2
--
>> a=linspace(2,30,5) -> 2~30까지 5등분 -> 몇등분안쓰면 100등분함 100등분이 디폴트값
>> x=2:5:30 -> 2~30까지 5씩증가 넘치면 안함
--
>> logspace(2, 4, 3)
ans =
100 1000 10000
10^2~10^4
--
>> log10( ans )
ans =
0 0.3010 0.4771 0.6021 0.6990
--> 각각을 벡터로 연산해줌 로그10의 1부터
---
>> b=2*a
b =
2 4 6 8 10
>> b(3)
ans =
6 -> 인덱싱 1부터 시작하는거
----->
인덱스 바꾸기 가능
>> b(3)=0;
>>
>> b
b =
2 4 0 8 10
---
>> x=4;
>> b(x-2)=b(x)
b =
2 8 0 8 10
---
>> b(5)
ans =
10
>> b(end)
ans =
10
>> b(length(b))
ans =
10
b의 끝을 지칭하는 3가지 방법
----
>> b(2:4)
ans =
8 0 8
>> b([1 2 3])
ans =
2 8 0
----
>> b([1 4 5])
ans =
2 8 10
>> b(1:2:5)
ans =
2 0 10
>> b(:) --> 열로 만듦
ans =
2
8
0
8
10
>>
b(:), b' 는 벡터일때만 동일함 둘이 완전 같지는 않음
: 는 열로 바꾸는건데 이미 열인것을 행으로 바꾸지는 않음
근데 ' 는 바꿀수 있음
---
>> b(1:2:5) = [0 0 0]
b =
0 10 0 8 0
-> 갯수가 딱 맞아야함
---
b =
0 10 0 1 2 0 0 7
>> b(11:13)=[1 2 3]
b =
0 10 0 1 2 0 0 7 0 0 1 2 3
>> b(8)=[]
b =
0 10 0 1 2 0 0 0 0 1 2 3
>>
----
>> length(a)
ans =
3
>> size(a)
ans =
3 3
>> a=[1 2 3;4 5 6]
a =
1 2 3
4 5 6
>> size(a)
ans =
2 3
>> length(a)
ans =
3
>> max(size(a))
ans =
3
---
>> a(1,2)
ans =
2
>> a
a =
1 2 3
4 5 6
>> a(2,2)
ans =
5
>> a(2,3)
ans =
6
>> a=magic(4)
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> -> 마방진 행 다 더하거나 열 다 더해도 값 같음.
--
>> a(1,1:4)
ans =
16 2 3 13
>> a(1,1:end)
ans =
16 2 3 13
>> a(1,:)
ans =
16 2 3 13
=a(:,:)
시작~끝까지
---
>> zeros(2,2)
ans =
0 0
0 0
>> zeros(2,5)
ans =
0 0 0 0 0
0 0 0 0 0
>> zeros(5)
ans =
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
>> ones(5)
ans =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>>
>> a(2:3,2:3)=zeros(2)
a =
16 2 3 13
5 0 0 8
9 0 0 12
4 14 15 1
>> a(4,2)
ans =
14
>> a(8)
ans =
14
-> 2차원 행렬이여도 2차원 인덱싱만 되는건 아님 세로부터 쭉 세는걸로 정의
---
>> a(x,y)
ans =
2 3 0
14 15 0
>> a=magic(4)
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> a(x,y)
ans =
2 3 13
14 15 1
>> x
x =
1 4
>> y
y =
2 3 4
>> -> 다시 볼 필요 있음.
---
>> a
a =
16 2 3 13 0 0 50
5 11 10 8 0 0 0
9 7 6 12 0 0 0
4 14 15 1 0 0 0
0 0 0 0 100 0 0
>> a(:,7)=[]
a =
16 2 3 13 0 0
5 11 10 8 0 0
9 7 6 12 0 0
4 14 15 1 0 0
0 0 0 0 100 0
>>
--
>> a.'
ans =
16 5 4 0
2 11 14 0
3 10 15 0
13 8 1 0
0 0 0 100
0 0 0 0
>> a'
ans =
16 5 4 0
2 11 14 0
3 10 15 0
13 8 1 0
0 0 0 100
0 0 0 0
-> a'는 복소수에서 부호 바꿔주는거 전치에서
---
>> a=[1-3j 2+2j;
3+4j 5+j]
a =
1.0000 - 3.0000i 2.0000 + 2.0000i
3.0000 + 4.0000i 5.0000 + 1.0000i
>> a.'
ans =
1.0000 - 3.0000i 3.0000 + 4.0000i
2.0000 + 2.0000i 5.0000 + 1.0000i
>> a;
>> a'
ans =
1.0000 + 3.0000i 3.0000 - 4.0000i
2.0000 - 2.0000i 5.0000 - 1.0000i
----
>> a=[1 2 3 4;5 6 7 8;9 10 11 12
]
a =
1 2 3 4
5 6 7 8
9 10 11 12
>> reshape(a,4,3)
ans =
1 6 11
5 10 4
9 3 8
2 7 12
>> 리쉐이프는 전치와는 다름 순서대로 가는게 리쉐이프 4번쨰인 2가 4행으로 들어온거
----
>> flipud(a)
ans =
4 14 15 1
9 7 6 12
5 11 10 8
16 2 3 13
>> fliplr(a)
ans =
13 3 2 16
8 10 11 5
12 6 7 9
1 15 14 4
---
>> a
a =
1 2 3
4 5 6
>> rot90(a)
ans =
3 6
2 5
1 4
>> rot90(ans)
ans =
6 5 4
3 2 1
>> rot180(ans)
Unrecognized function or variable 'rot180'.
>> rot90(ans)
ans =
4 1
5 2
6 3
>> rot90(ans,-1) -> 시계방향으로 돌린거
ans =
6 5 4
3 2 1
>>
---
>> a=magic(3)
a =
8 1 6
3 5 7
4 9 2
>> triu(a)
ans =
8 1 6
0 5 7
0 0 2
>> tril(a)
ans =
8 0 0
3 5 0
4 9 2
>>
>> diag(a)
ans =
8
5
2
>> diag(a,1) -> 대각성분에서 하나 위에 대각 성분
ans =
1
7
>>
---
>> a
a =
8 1 6
3 5 7
4 9 2
>> diag(diag(a))
ans =
8 0 0
0 5 0
0 0 2
>> triu(a) + tril(a)-diag(diag(a))
ans =
8 1 6
3 5 7
4 9 2
---
>> x=['x' 'y' 'z']
x =
'xyz'
>> x=['xyz']
x =
'xyz'
>> x(1)
ans =
'x'
>> x(2)
ans =
'y'
>> x(3)
ans =
'z'
-> 문자의 표현
---
>> x=['xyz';'abc']
x =
2×3 char array
'xyz'
'abc'
>> x(2,3)
ans =
'c'
>> x=['xyz';'a' 'b' 'c']
x =
2×3 char array
'xyz'
'abc'
>> x='abcde'
x =
'abcde'
>> x(2:3)='0'
x =
'a00de'
>> x(2:3)=0
x =
'a de'
--
>> num2str(2)
ans =
'2'
>> a=123
a =
123
>> num2str(a)
ans =
'123'
>>숫자 123을 문자 123으로 바꾸는 명령어
---
>> a='12345'
a =
'12345'
>> b='34'
b =
'34'
>> strfind(a,b)
ans =
3
-> 똑같은게 3번째에 있다는 뜻
--> 2장 끝.
---
연습문제
>>
>> a=-21:5:-1
a =
-21 -16 -11 -6 -1
>> linspace(3,43,9)
ans =
3 8 13 18 23 28 33 38 43
>> logspace(-1,2,5)
ans =
1.0e+02 *
0.001000000000000 0.005623413251903 0.031622776601684 0.177827941003892 1.000000000000000
>> format short
>> logspace(-1,2,5)
ans =
0.1000 0.5623 3.1623 17.7828 100.0000
>>
--
>> A=[19 8 -23 5 91 7];
>> A(legnth(A))=A(1)
Unrecognized function or variable 'legnth'.
>> A(length(A))=A(1)
A =
19 8 -23 5 91 19
>> A(2:2:4)=0
A =
19 0 -23 0 91 19
>>
>> A(:,2:4)
ans =
9 3 3
0 0 0
4 7 1
>> A(:,2:4)=[]
A =
2 5
0 0
6 0
---
>> a=ones(5)
a =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> a(:,2:2:4)=0
a =
1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
>>
7번
>> a
a =
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
>> b=eye(3)
b =
1 0 0
0 1 0
0 0 1
>> flipup(b)
Unrecognized function or variable 'flipup'.
Did you mean:
>> flipud(b)
ans =
0 0 1
0 1 0
1 0 0
>> c
Unrecognized function or variable 'c'.
>> c=flipud(b)
c =
0 0 1
0 1 0
1 0 0
>> d=b+c
d =
1 0 1
0 2 0
1 0 1
>> a(2:4,2:4)=d
a =
1 1 1 1 1
1 1 0 1 1
1 0 2 0 1
1 1 0 1 1
1 1 1 1 1
>>
--
>> a=1
a =
1
>> a(2:3,2:3)=2*ones(2)
a =
1 0 0
0 2 2
0 2 2
>> a(4:6,4:6)=3*ones(3)
a =
1 0 0 0 0 0
0 2 2 0 0 0
0 2 2 0 0 0
0 0 0 3 3 3
0 0 0 3 3 3
0 0 0 3 3 3
>>
8번 매트릭스 확장 연습문제
---
char 문자열에서 빈자리를 써서 칸수를 알아서 맞춰줌
> a(2:4,2:4)= b
a =
5×5 char array
'aaaaa'
'abbba'
'abcba'
'abbba'
'aaaaa'
3장
.의 의미
a= ones(3) 일때
4-a는 . 없이 계산이 가능함 모든 엘리먼트에 1을 빼서 연산해줌
근데 4/a는 오류가 남 수학적으로 4를 엘리먼트들로 나눌수 없기 때문
근데 4./a는 연산 가능
공식 정리 → 즉 벡터들에 각 엘리멘트에 연산을 해주고 싶을때는
1. 엘리먼트를 제곱이나 뭘 뒤에 해주고 싶다 → x .^2
2. 만약 어떤 값에 그 행렬을 곱해주거나 나눠주거나 연산을 하고 싶다 이땐 앞에→ .*x
. 찍는 예제
50번 ppt 공학예제
>> treal=13.12+0.6215*t-11.37*v.^(0.16)+0.3965*v.^(0.16).*t ->점 찍는거 유의하기
treal =
Columns 1 through 5
-12.9340 -15.2608 -16.7465 -17.8606 -18.7608
Column 6
-19.5205
---
공학예제2
Did you mean:
>> -(r1+r3+r2)*i2 + r2*i1
Unrecognized function or variable 'i2'.
>> -(r1+r3+r2)*i2 + r2*i1+i3*r3
Unrecognized function or variable 'i2'.
>> -(r3+r4)*i3+r3*i2=0
-(r3+r4)*i3+r3*i2=0
↑
Incorrect use of '=' operator. Assign a value to a variable
using '=' and compare values for equality using '=='.
Did you mean:
>> a=[-(r2+r5) r2 0; r2 -(r1+r3+r2) 0; r3 -(r3+r4)] -> 식 틀림
Error using vertcat
Dimensions of arrays being concatenated are not consistent.
>> a=[-(r2+r5) r2 0; r2 -(r1+r3+r2) 0; 0 r3 -(r3+r4)]
a =
---- 3장끝~
3장 연습문제
>>1번
>> x=[0:2:6]; %x가 행렬이네?
>> y=(x/4).^2 + ((5-x)/4).^2 %x뒤에 제곱을 붙일때는 .^2 이 되야함
y =
1.5625 0.8125 1.0625 2.3125
>> y=200-20*x.^2 +0.01*x.^3
y =
200.0000 120.0800 -119.3600 -517.8400
>>
>>
----
>> y=(1/sqrt(2))*exp((-x.^2)/2)
y =
Columns 1 through 7
0.0000 0.0002 0.0079 0.0957 0.4289 0.7071 0.4289
Columns 8 through 11
0.0957 0.0079 0.0002 0.0000
----------------
>> h=[1:5]
h =
1 2 3 4 5
>> r=[1:0.5:3];
>> s=pi*r.*sqrt(r.^r+h.^2) -> 뒤에꺼가 벡터로 나오니까 앞에도 .
s =
4.4429 11.3852 22.6543 39.9567 67.9630
>>
>> v=(1/3)*pi*(r.^2).*h
v =
1.0472 4.7124 12.5664 26.1799 47.1239
-------------
>> p=80000000; n=10;
>> r=[0.01 0.02 0.03 0.05 0.07 1.];
>> s=p*(1+r*n)
s =
88000000 96000000 104000000 120000000 136000000 880000000
>>
** 중요 . 은 각각의 엘리먼트에 수학적으로 불가능한 연산들을 가능하게 해줌
행렬끼리 덧셈 뺄셈을 할때에는 차원이 같아야한다.
- 역행렬의 표현
a*inv(b) -> a/b와 같은 의미 = a * b의 역행렬 (but a./b와는 다름)
a\b는 b에 앞에꺼 역행렬을 곱해준다는 의미
관계 연산자
x~=y -> 같지 않다의 표현
관계 연산자는 결과를 매트릭스 바이 매트릭스로 참거짓을 판단해줌 0 ,1
로 표현
논리 연산자 & -> 무조건 이거만 쓴다 생각
det(a) → 판별식을 구함
a= rand(1,10) → 0~1사이 랜덤넘버를 10개 지정해라
이러면 소수점이 나오는데 이를 정수로 바꾸기 위해
b=fix(a*1000)
이때 max,min 함수로 최대 최소를 구할 수 있는데 그 벡터의 위치만 받고 싶을때 [~,b]=max(b)
원래 [x,y]=max(b) → b의 행렬에 x=값, y=위치를 알려줌 따로 정의하지 않아도
a=magic(3)에서 max(a)를 쓰면 8 9 7 이나옴 제일 큰 값 하나만 나올 것 같지만 열끼리 연산하기 때문
모든 엘리먼트의 합구하기 sum(sum(a))
평균 → mean(a)
표준편차 → std(a)
분산 → var(a)
sort(a) → 각자 열이 오름차순 정리
sort(a,’descend’) → 내림차순
median(a) → 오름차순 나열한다음 가운데꺼 뽑아냄
dot(a,b) → 내적
cross(a,b) → 외적
#4장
clc;
clear;
a=2;
b=3;
fprintf('\n\ta=%d, b=%d\n\n',a,b); %줄바꿈하고 한 탭 뒤로 밀고 a,b 출력후 줄바꿈 두번
-----------------------
fprintf('\n\ta=%10d, b=%5d\n\n',a,b); %10d 10개띄고 오른쪽 정렬 -는 왼쪽 정렬
% a= 2, b= 3 -> 결과값임
fprintf('\n\ta=%-+10d, b=%.3f\n\n',a,b);
% a=+2 , b=3.000
--------------------
%평균을 구하는 프로그램
clc;
clear;
fprintf('*******************************************************\n')
fprintf('프로그래밍 개론 과목에 대한 5명의 평균을 구하는 프로그램\n');
fprintf('*******************************************************\n\n')
score = input('>> 5명의 성적을 입력:');
fprintf('[1]%d\n',score(1)); %첫번째 인덱스에 score에 입력된 변수중 (1)번을 넣어줌
fprintf('[2]%d\n',score(2)); %[2]는 그냥 출력된거 의미x
fprintf('[3]%d\n',score(3));
fprintf('[4]%d\n',score(4));
fprintf('[5]%d\n',score(5));
fprintf('평균:%.2f\n\n',mean(score));
% 입력 >> 5명의 성적을 입력:[10 20 30 40 50] -> 배열 형태로 넣어줌
---------------------------
% 파일 열기
fileid = fopen('파일이름','허용권한) %이건 그냥 형식임 아래가 실제 활용
fileid = fopen('test.txt','w'); % 없으면 생성 쓰기모드
fileid = fopen('test.txt','w');
fprintf(fileid,'평균 : %3f\n',mean(score)); % 새로운 txt 파일에 mean(score)를 넣겠다는거
fopen(fileid); %닫기
---------------------------
clc;
clear;
fprintf('*******************************************************\n')
fprintf(' 성적처리 프로그램 \n');
fprintf('*******************************************************\n\n')
score = input('>> 벡터를 입력:'); %나는 [2 2] 입력해줌
fileid = fopen('test.txt','w'); //쓰기 모드로 파일 열고
fprintf(fileid,'mean median max min\n'); %fileid 텍스트 파일에 쓰겠다
fprintf(fileid,'%.2f %.2f %d %d\n', ...
mean(score),median(score),max(score),min(score)); %이것도
fopen(fileid); %닫기
% -> 이렇게 되면 명령창에 결과가 안뜨고 텍스트 파일이 열리고 그 안에 결과가 생성됨.
%mean median max min -> 실제 생긴 txt 파일을 열어보니 생긴 결과
%2.00 2.00 2 2
% save variable -> 새로운 파일이 생성됨. 만든 변수값들을 저장함.
%clear all 해서 변수들을 다 지워도 load variable 하면 그때 저장한 변수들을 다 불러와줌.
% 근데 특정변수만 저장하고 싶을때 save variable2 b c //b c 만을 저장함
%함수형태로 사용하기
> save('varible')
>> load('varible')
>> a=2;
>> save('varible')
>> load('varible')
>> b=3;
>> save('varible2','a','b'); %특정 변수만 저장
>> clear all
>> load('varible2')
4장 공학예제 및 연습문제
clc;
clear all;
R= input('저항값을 입력:');
C= input('캐패시터 값을 입력:');
F= input('주파수를 입력:');
x=1/(2*pi*F*C);
z=sqrt(R*R+x*x);
fprintf('임피던스는 %.3f 입니다.\n',x ...
...
);
% 마이크로의 표현은 1e-6
연습문제 1 %중앙값 구하기
clear all;
clc;
a=input('10개의 정수값을 입력하시오:');
b=sort(a); %새로운 변수로 정의
med1=(b(5)+b(6))/2;
fprintf('중앙값 : %f\n',med1); %fprintf 구조 유의
---------------------------------------
fprintf('중앙값: %f\n',median(a)); % 이렇게 구해도 같게 나옴
% 결과 :
%10개의 정수값을 입력하시오:[1 2 3 4 5 6 7 8 9 10]
%중앙값 : 5.500000
%중앙값: 5.500000
------------------------
연습문제 2 %홀수 번째 합 구하고 disp사용
clear all;
clc;
a=input('10개의 정수값을 입력하시오:');
idx = [1:2:10]; %홀수 번째를 나타낼수 있는 변수
disp(sum(a(idx))); %a의 idx값.
---------------------------------------
3.
clear all;
clc;
a=[1 2];
b=[4 3];
len_a = sqrt(a(1)*a(1)+a(2)*a(2));
len_b = sqrt(b(1)*b(1) + b(2)*b(2));
tmp = len_a*len_a*len_b*len_b - dot(a,b)^2; %dot는 내적
s = 0.5*sqrt(tmp);
disp(s);
4. 스킵함
---------------------------------------
5.
clear all;
clc;
a= input('a: ');
b= input('b: ');
c= input('c: ');
x= -b/(2*a);
y= -(b*b-4*a*c)/(4*a);
disp([x,y]);
---------------------------------------
6.
clear all;
clc;
point1=input('point1:');
point2=input('point2:');
point3=input('point3:');
fprintf('삼각형의 무게 중심은 (%.3f,%.3f)\n', ...
(point1(1)+point2(1)+point3(1))/3, ...
(point1(2)+point2(2)+point3(2))/3)
------------------------------
clear all;
clc;
point1=input('point1:');
point2=input('point2:');
point3=input('point3:');
%{
fprintf('삼각형의 무게 중심은 (%.3f,%.3f)\n', ...
(point1(1)+point2(1)+point3(1))/3, ...
(point1(2)+point2(2)+point3(2))/3)
%}
point = [point1;point2;point3];
fprintf('삼각형의 무게 중심은 (%.3f,%.3f)\n',mean(point));
// 다른 풀이
7.
----------------------
>> a=magic(3)
a =
8 1 6
3 5 7
4 9 2
>> [x,y]=max(a)
x =
8 9 7
y =
1 3 2
>> [~,p]=max(x)
p =
2
>> q=y(2)
q =
3
>>
---------------------
clear all;
clc;
X=input('배열을 입력:');
[x,y]=max(X)
[~,max_col]=max(x);
max_row = y(max_col);
[x,y]= min(X);
[~,min_col]=min(x);
min_row = y(min_col);
tmp = X(max_row,max_col);
X(max_row,max_col) = X(min_row,min_col);
X(min_row,min_col)=tmp;
X
5장 반복문 if, switch , for
if문 나만의 공식
if 조건
실행시킬 내용
else if 조건
실행시킬 내용
else
실행시킬 내용
end
% c언어와 차이점 중괄호 없고 대신 끝을 알려주는 end를 사용함
if a(1) > b(1)
fprinf("yes\n");
end
%c와의 차이점 중괄호가 필요없고 대신 끝을 알려주는 end를 사용함
if a(1) > b(1)
fprintf("yes\n");
end
a=[1 2 3];
b=[-1 3 2];
%c와의 차이점 중괄호가 필요없고 대신 끝을 알려주는 end를 사용함
if (a(1) < b(1) && a(2) > b(2)) && (a(3)) >(b(4)) %b(4)는 오류가 나와야하는데 스크립트 언어
가 아니기 때문에 2번째 라인까지만 실행해서 결과값이 이미 나와 오류가 안나온거
fprintf("yes\n");
else
fprintf("no\n");
end
% if(a) %a의 모든 문장이 위에 if 문을 수행했을때 다 yes가 나와야함 즉 if (a>b)와 같이 실행 가능
----------------------
%합격 불합격 프로그램
score = input("점수를 입력하세요:");
if (score >= 60)
fprintf("합격입니다\n");
else
fprintf("불합격입니다\n");
end
-------------------
%합격 불합격 프로그램
score = input("점수를 입력하세요:");
if (score >= 90)
grade = 'A';
elseif (score >=80)
grade = 'B';
elseif (score >=70)
grade = 'C';
elseif (score >=60)
grade = 'F';
else
grade = 'F';
end
fprintf("당신의 성적은 %s 입니다.\n",grade)
end %여기에 end를 적으면 fprintf문은 실행되지 않음
switch문
score = input("점수를 입력하세요:")
switch score
case 9 %c에선 :c추가
grade = 'A'; %c에선 break 사용 안넣어주면 c에선 무조건 차례로
%동작하다가 f만 나옴 가다가 하나라도 참이면 그 밑에껀 다참으로 간주
case 8
grade = 'B';
case 7
grade = 'B';
case 6
grade = 'D';
otherwise %c에서 defalut의 역할
grade = 'F';
end
fprintf("당신의 성적은 %s 입니다.\n",grade);
%즉 c에서는
case 9
case 8
case 7
grade = 'a' 이런식으로 묶어서 값을 줄 수 있음 매트랩은 모든 문에 break가 자동으로 들어가 있어서 아래처럼 해줘야함
-> 그래서
case{9,8,7} %이렇게 매트랩에서 사용가능함.
case 9
grade 'a'; -> 987 3번 반복한거랑 같은 의미
-------------
사용 정답
%switch 문
score = input("점수를 입력하세요:")
q=floor(score/10); %xcore가 93 같은 값이 들어오면 9출력됨
switch q
case {9,10} %c에선 :c추가
grade = 'A'; %c에선 break 사용 안넣어주면 c에선 무조건 차례로
%동작하다가 f만 나옴 가다가 하나라도 참이면 그 밑에껀 다참으로 간주
case 8
grade = 'B';
case 7
grade = 'C';
case 6
grade = 'D';
otherwise %c에서 defalut의 역할
grade = 'F';
end
fprintf("당신의 성적은 %s입니다",grade);
반복문 - for문
for x = 1:10 %그냥 1~10까지 1씩 증가 1:2:10 -> 13579
disp(x); %x는 1부터 10까지 아래의 동작을 반복하겠다
end
a=1:10; %세미콜론 중요
for x=a %그냥 1~10까지 1씩 증가
disp(x);
end
-----------------
for문으로 팩토리알 계산
n = input("숫자를 입력하세요:")
f=1;
for a=1:n %a가 1부터 n까지 아
f=f*a;
end
fprintf("%d의 팩토리얼 %d(%d)",n,f,factorial(n)); %마지막은 매트랩 제공함수
----------------------------
-> 틀렸었음
clear all;
a = input("행벡터를 입력하세요:");
sum= 0;
for k=a %반복을 위한 변수 k에 입력받은 벡터 A를 대입 for문은 벡터a의 원소 갯수만큼 반복
%그때마다 k에는 벡터 a의 원소가 차례로 대입됨.
sum = sum +k;
end
fprintf("sum은 %d입니다",sum);
while문
A = input("숫자를 입력하세요:");
k=1;
while k <= length(A)
sum = sum +A(k);
k= k+1;
end
fprintf("sum은 %d(%d)입니다",sum,sum(A));
------------------
공학예제
clear all;
clc;
alpha = 1.9e-5; %e는 10^-5의 의미 자연상수 아님
v0 = 200;
t=1;
while v0*3*alpha*t < 1
t=t+1;
end
disp(t)
---------------
%중첩반복문
clear all;
clc;
a= input("행벡터를 입력하시오:");
for k = a
if rem(k,2) == 0 %짝수의 표현 2로 나눈 나머지가 0이면
for m = 1:k %카운트 변수 벡터 k의 갯수 차례로 대입하며 반복
fprintf('*');
end
fprintf('\n');
end
end
%(a & 0x01) == 0 2의 배수 표현 짝수 표현 비트와이즈 연산빠름% ex) (a & 0x03) 4의 배수 표현
cotinue, break
a= input("행벡터를 입력하시오:");
for k = a
if rem(k,2) ==0 %이 문장을 사용하면서 홀수 표현
continue; % 이 아래 무시하고 다시 위로 올라감 즉 아래의 반복 출력문은 홀수만 들어감
end
for m=1:k
fprintf('*');
end
fprintf('\n');
end
cotinue, break
a= input("행벡터를 입력하시오:");
for k = a
if rem(k,2) ==0 %이 문장을 사용하면서 홀수 표현
continue; % 이 아래 무시하고 다시 위로 올라감 즉 아래의 반복 출력문은 홀수만 들어감
end
for m=1:k
fprintf('*');
end
fprintf('\n');
end
%예제 5-9
clear all;
n= input("숫자를 입력하시오:");
sum = 0;
for k= 1:n
sum = sum+3^(2*k) + 2*k;
end
disp(sum);
%break를 이용한 풀이
clear all;
clc;
n= input("숫자를 입력하시오:");
sum = 0;
k=1;
while true %true를 조건으로 써주면 항상 참 -> 무한반복
if(k>n)
break; %while문 밖으로 나감 아래의 disp로 가겠네
end
sum = sum+3^(2*k) + 2*k;
k=k+1;
end
disp(sum);
-------------
공학예제1
clear all;
clc;
lo = 1000;
g = 9.8;
x= 1.01e5;
h=0;
while lo*g*h/x < 1
h= h+0.01;
end
disp(h);
--------------
공학예제2
clear all;
clc;
n=1;
diff = 1; %두 값의 차이 임의로 10^-10보다 큰값만 주면 됨. 첫 whil
%에서 빠져나오게 하려고 0주면 아래 조건에 따라 끝나버림
while diff > 1e-10 %10^-10
a= sqrt(n*n + n) - n;
n= n+1;
b = sqrt(n*n + n) - n; %f(n+1)-f(n)으로 계산
diff = abs(b-a);
end
disp(a); %수렴값
---------------
연습문제
%{
n= input("자연수를 입력하시오:");
k=1;
while k==n
a = ((-1)^(k-1)) / (k*2^k);
sum(a);
end
disp(a) % 내 틀린 풀이
---------
sum=0;
for k= 1:n
sum = sum + ((-1)^(k-1)) / (k*2^k);
end
for k= 1:n
sum = sum + ((-1)^(k-1)) / (k*2^k);
end
------------------
clear all;
clc;
a = input("2차항 계수 입력:");
b = input("1차항 계수 입력:");
c = input("상수항 계수 입력:");
D = b^2 - 4*a*c;
x1 = (-b + sqrt(D)) / (2*a);
x2 = (-b - sqrt(D)) / (2*a);
fprintf("이차방정식의 두 근은 %f, %f",x1,x2)
%}
%3번 문제
clear all;
clc;
n=1;
diff = 1;
while diff > 1e-13
val = (2*n+1)/ n^2;
n= n+1;
next = (2*n+1)/n^2;
diff = abs (next - val);
end
disp(next);
disp(n);
%4번 문제
clear all;
clc;
f2_x = 60;
f2_y = 0;
f3_x = 0;
f3_y = -120;
for theta = 40:2:50
f1_x = -300*cosd(theta);
f1_y = 300*sind(theta);
f_x=f1_x+f2_x+f3_x; %x 전체의 알짜힘
f_y=f1_y+f2_y+f3_y;
fprintf("%d degree: f_x = %f, f_y = %f\n",theta, f_x,f_y)
end
--------------
다른 고급 풀이
fx= [0,60,0];
fy= [0,0,-120];
for theta=40:2:50
fx(1) = -300*cosd(theta);
ft(1) = 300*sind(theta);
fprintf("%d degree : f_x = %f, f_y = %f\n, theta, sum(fx+fy+fx(1),"all");
end
---------------------------------
%6번 문제
v0 = 0.25;
b= 5e9;
for p = 1.6e7 : 0.1e7:2.6e7
v_new = v0*p/b;
disp(v_new);
end
---------------------------------
7번 -> 다시 봐야함
n = input("층의 높이를 입력하시오:");
%공백의 갯수는 n-a
for a= 1:n
for j=1:n-a
fprintf(' ');
end
%문자의 갯수는 2a-1 개
for j=1:2*a-1
fprintf("A");
end
fprintf("\n");
end
문자의 개수1 3 5 -> 2k-1
공백의 갯수 3층 가정
bbabb
baaab
aaaaa
1층에 n-1개 , 2층에 n-2개, 3층에 n-3개
층수를 n이라 가정했을때
반복문 구조 짜보자
먼저 층을 쌓아야하니까 전체반복은 for i = 1:n (1부터 n층까지 반복)
첫번째 공백이 먼저 출력되어야함
근데 얘는 층수 -1 만큼 필요함
for i = 1:n
for j = 1 : n-i
fprintf(" ");
검증 -> n이 3입력되고 i= 1 즉 1층 일때
j = 1:2
공백 2개 출력 1층에 공백 2개 만족
i=2일떄 공백 1개출력 만족
end 로 닫자
문자 반복문 출력
for k = 1:2i-1
fprintf("A")
end
end
검증 -> i=1 일때 1:1 꼭대기 1층에 문자 1개 출력
완료
-------------------
8번 -> ok
a = input("벡터를 입력하시오:");
for i = 1:length(a)
temp = 0; %값이 이상하게 나오면 저장 변수 어디다 썼는지 확인
for j=1:length(a)-1
if a(j) > a(j+1)
temp = a(j);
a(j) = a(j+1);
a(j+1) = temp;
end
end
end
disp(a)
---------------
9번 틀린풀이
%}
%{
n= input("자연수를 입력하시오 :");
for i=2:n
if (i~=1 && i~= n)
elseif rem(n,i)==0
disp(i)
break;
end
end
%}
-------------------
----------------
맞는 풀이 9
n= input("자연수를 입력하시오 :");
for i=2:n
cnt=0;
for j=1:i
if rem(i,j) == 0
cnt=cnt+1;
end
end
if cnt == 2
disp(i);
end
end
-----------------------10
n = input("자연수 범위를 입력하세요:");
cnt=1;
for j=1:n
if(rem(n,j)==0)
a(cnt) = j; %차례로 배열에 저장하는 방법
cnt = cnt+1;
end
end
disp(a);
fprintf("갯수는 %d개 입니다",length(a))
%{
108번 1부터 n까지, 1부터 m까지 숫자가 적힌
서로 다른 주사위 2개를 던졌을 때 나올 수 있는 모든 경우를 출력해보자.
n=input("n을 입력하시오:");
m=input("m을 입력하시오:");
for i = 1:n
for j = 1:m
fprintf("(%d,%d)\n",i,j)
end
end
%}
%{
빛 섞어 색만들기
빨강(red), 초록(green), 파랑(blue) 빛을 섞어
여러 가지 빛의 색을 만들어 내려고 한다.
빨강(r), 초록(g), 파랑(b) 각각의 빛의 개수가 주어질 때,
(빛의 강약에 따라 0 ~ n-1 까지 n가지의 빛 색깔을 만들 수 있다.)
주어진 rgb 빛들을 다르게 섞어 만들 수 있는 모든 경우의 조합(r g b)과
총 가짓 수를 계산해보자.
%{
clear all;
clc;
a = input("빛 r의 개수를 입력하세요:");
b = input("빛 g의 개수를 입력하세요:");
c = input("빛 b의 개수를 입력하세요:");
cnt=0;
for i = 1:a-1
for j = 1:b-1
for k= 1:c-1
if(k>=1)
cnt = cnt+1;
end
end
end
end
fprintf("조합의 개수는 %d개 입니다",cnt)
c언어 풀이
#include<stdio.h>
int main(){
int r,g,b;
scanf("%d %d %d",&r, &g, &b);
for(int i = 0; i<r; i++){
for(int j = 0; j<g; j++){
for(int k = 0; k<b; k++ ){
printf("%d %d %d\n",i,j,k);
}
}
}
printf("%d", r*g*b);
return 0;
}
%}
%}
%{
시작단부터 끝단까지 구구단 출력하기
a= input("시작단을 입력하시오:");
b= input("끝단을 입력하시오:");
for k =a:b
for i =1:9
fprintf("%d*%d = %d\n",k,i,k*i);
end
end
%{
사각형 만들기, 삼각형은 i,j 범위 건들기
n = input("사각형의 길이를 입력하세요:");
for i = 1:n
for j = 1:n
fprintf("*"); %가로로 한줄
end
fprintf("\n");
end
------------------------------------
%{
동렬이는 수학 문제를 풀다 다음과 같은 수열을 보았다.
Sn=(1)+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+...+n)
임의의 정수 n이 주어질 때 이 수열의 합 Sn을 구하는 프로그램을 작성하시오.
%}
clear all;
clc;
n= input("수열의 범위를 입력하시오:");
temp = 0;
sum1 = 0;
for i = 1:n
temp = temp+i;
sum1 = sum1+ temp;
end
disp(sum1)
주사위는 각 면에 1~6까지 적혀 있는 정육면체이다.
이런 주사위 2개를 굴려 합이 k가 나오는 경우를 조사하려고 한다.
예를 들어, 주사위 두개를 굴려 5가 나오는 경우는 1 4, 2 3, 3 2, 4 1 이다.
그리고 주사위를 하나만 굴리는 경우는 없다.
k = input("주사위 합이 될 수를 입력하세요:");
for i = 1:6
for j = 1:6
if(i+j) == k
fprintf("(%d,%d)",i,j)
end
end
end
------------------------------------
%{
삼각형만들기4
*
**
***
**
*
n = input("n을 입력하세요:");
for i = 1:n*2
fprintf("\n");
if i <= n
for j =1:i
fprintf("*");
end
else
for k =i:n*2-1 %이게 키포인트였음 감소하는거 만드는 공식임
fprintf("*");
end
end
end
%}
%평행사변형 만들기1
n = input("변의 길이를 입력하세요:");
for i = 1:n
for j = n-i:-1:1
fprintf(" ");
end
for k = 1:n
fprintf("*");
end
fprintf("\n");
end
%평행사변형 만들기2
n = input("평행사변형의 변의 길이를 입력하세요:");
s = input("방향을 입력하세요:",'s');
if s=='L'
for i =1:n
for o = n-i:-1:1
fprintf(" ");
end
for k=1:n
fprintf("*");
end
fprintf("\n");
end
else
for j=1:n
for p=1:j
fprintf(" ");
end
for m=1:n
fprintf("*");
end
fprintf("\n");
end
end
%ㅈㄱㅈㄱ
h= input("높이를 입력하세요:");
r = input("반복횟수를 입력하세요:");
for i = 1:r
for j =1:h
for k =1:j
fprintf(" ");
end
fprintf("*");
fprintf("\n");
end
for n=h-2:-1:0
fprintf(" ");
end
fprintf("*");
fprintf("\n");
end
%ㅍㅅㄱㅇㄷ ㅂㄱ
n = input("층을 입력하세요:");
for i =1:n
if i>=2 && i<=n-1
for k = n-i:-1:1
fprintf(" ");
end
fprintf("*");
for m=1:n-2
fprintf(" ");
end
fprintf("*");
fprintf("\n");
else
for p = n-i:-1:1
fprintf(" ");
end
for j= 1:n
fprintf("*");
end
fprintf("\n");
end
end
6장 함수
함수 : 저장하기 눌러서 실행위쪽 파일명과 함수명이 같아야함
%{
함수의 구조
function[알고 싶은 값들 = 식으로 미리 저장하고 싶은거] = 함수명(넘겨줘야할값= 식에 필요한 입력들)
%}
사용법
[req] = paral(Rin)
----------------------------------------------
clear all;
clc;
%삼각형의 면적을 계산하는 함수 만들기
function [area] = triangle(side, height) %2개 이상에선 area 부분에 괄호 필수
area = side * height /2;
%triangle 삼각형의 면적을 구함
%side : 밑변
%height : 높이
help triangle 하면 위에 주석 문장도 쭉 나옴
end %있어도 좋고 없어도 좋음, 같은 디렉토리에 있을때만
----------------------------------------------
function test_output()
disp('this is test function...');
end
function test_output()
for i=1:n
disp('this is test function...');
end
end
----------------------------------------------
%병렬 합성 저항을 구하는 함수
function req = resisterparalleled( Rin )
req = 1./ sum(1./Rin);
end
%{실행은 Rin에 미리 [1 2 4] 값 저장하고
%req = paral(Rin) 이렇게 사용함
----------------------------------------------
function [ stop,front,rear]= doppler(f,v) %()넘겨줘야할 값 주파수,속도
v0 = 300; %정지상태에서의 음속
stop = v0/f;
front = (v0 - v) / f; %파장이 짧아짐
rear = (v0 + v) / f; %파장이 늘어남
end
>> [stop front rear] = doppler(300,20) 입력창 -> 여러개의 값을 다 받으려면 이런 형식으로
front가 필요 없다면 [stop, ~, rear] 이런식으로 하면 됨
----------------------------------------------
익명함수 즉석에서 간이로 함수가 필요할때 임시로 사용
ftn = @(x,y)(3^x-8)/(4-y^2) %ftn은 함수명 @ (인자)(실제 수식)
z=ftn(5,6) %함수 사용
인라인함수
>> ftn = inline('(3^x-8)/(4-y^2)','x','y') %여기서는 인자를 수식뒤에 ,'x'로 알려줌
ftn =
인라인 함수:
ftn(x,y) = (3^x-8)/(4-y^2)
>>
2개의 형식 비교해보기
>> ftn = inline('x^2+2*x-5','x');
>> ftn(3)
ans =
10
>> ftn2 = inline('x^2+2*x-5'); %변수가 하나있을때는 오류가 안나네 뒤에 인자를 안넣어줘도
>> ftn2(3)
ans =
10
>>
------------------
지역변수와 전역변수, 부함수 중첩함수
%triangle 삼각형의 면적을 구함
%side : 밑변
%height : 높이
%호출은 트라이엥글(1,3) 이런식으로 하겠네
end %있어도 좋고 없어도 좋음, 같은 디렉토리에 있을때만
%익명함수 즉석 함수 만들기 방법
%함수명 = @(인자,인자)(식) , z= ftn(5,6)으로 사용가능
%인라인함수 함수명 = inline('식','인자','인자')
% z= ftn(3,4)
%지역변수 전역변수
%중첩함수 (함수끼리 #변수를 서로호출 가능 각 함수쓰고 end써줘야함)
%부함수( 주함수 안에 부함수가 들어가있는데 이때 입력 인자 출력인자 같아도 상관 서로 변수 호환이 안되니까
%없음 함수의 END안붙여도 됌
function [min1,max1] = minmax(x); %min max 동시에 구하는 함수 만들기
min1 = getmin(x);
max1 = getmax(x);
end
function min1 = getmin(x) %이렇게 할 필요x 걍 연습임
min1 = min(x);
end
function max1 = getmax(x)
max1 = max(x);
end
실행
>> [min1 max1] = minmax(1:10)
min1 =
1
max1 =
10
>> [min max] = minmax(1:10)
min =
1
max =
10
>> getmin([1:10])
'getmin'은(는) 인식할 수 없는 함수 또는 변수입니다. %getmin은 바깥에선 안보임 서브 펑션임 네임펑션은 하나임 파일명과 같은거 그래서 오류가 난것임
정정 제안:
>> getm([1:10])
------------------
function [min1 y] = minmax(x); %상위 펑션임 이 안에 변수들은 아래의 펑션에 영향을 미친다
offset = 10; %getmin 함수 호출 전에 써줘야 동작
getmin(x);
y=0; %상위에 선언해주는 것이 안전
min1 = 0; %이것도 아래에서 처음 선언 되기 때문에 위에 선언 해주는 게 좋음
function getmin(x)
min1 = min(x) + offset; %미니멈 값에 offset을 더하는 함수
y=20; %지원안할 수도 있음
end
end
%실행 >> minmax([1:10])
ans =
11
>> [a,b] = minmax([1:10])
a =
11
b =
20
>>
-----------------------------
공학예제2
%{
function [tpeak, hpeak, tfloor,d] = missileResult(x,v)
vpeak = 0;
tpeak = (v*sind(x))/g;
hpeak = v*sind(x)*tpeak - (1/2)*g*tpeak*tpeak;
tfloor = 2*v*sind(x)/g;
d = v*cosd(x)*tfloor
end
%}
%중첩함수로 짜야함 : tpeak 가 아래의 수식에도 쓰이고 아래에 수식에 위에가 필요
%중첩함수는 다 보이니까 중첩함수로 짜야할 필요성을 느껴야함
function [tpeak, hpeak, tfloor,d] = missileResult(x,v) %상위함수
g = 9.8;
tpeak = 0;
hpeak = 0;
tfloor = 0;
d = 0;
gettpeak(); %순서 중요
gethpeak();
gettfloor();
getd();
function gettpeak()
tpeak = (v*sind(x))/g;
end
function gethpeak()
hpeak = v*sind(x)*tpeak - (1/2)*g*tpeak*tpeak;
end
function gettfloor()
tfloor = 2*v*sind(x)/g;
end
function getd()
d = v*cosd(x)*tfloor
end
end
%부함수 서브펑션으로 만드는 방법 더 복잡함
function [tpeak, hpeak, tfloor,d] = missileResult(x,v)
global g; %global의 사용
g=9.8;
tpeak= gettpeak(x,v);
hpeak= gethpeak(x,v,tpeak);
tfloor =gettfloor(x,v);
d = getd(x,v,tfloor);
end
function tpeak = gettpeak(x,v)
global g;
tpeak = (v*sind(x))/g;
end
function hpeak =gethpeak(x,v,tpeak)
global g;
hpeak = v*sind(x)*tpeak - (1/2)*g*tpeak*tpeak;
end
function tfloor =gettfloor(x,v)
global g;
tfloor = 2*v*sind(x)/g;
end
function d =getd(x,v,tfloor)
d = v*cosd(x)*tfloor;
end
----------------------------------
%{
global sum;
sum = 0;
result = accumulate( 5 ); %누적해서 결과를 보여주는거
disp(result);
result = accumulate( 3 );
disp(result);
result = accumulate( 2 );
disp(result);
function result = accumulate(x)
global sum; %해줘야 동작 c에서는 static int sum= 0; int sum = 0;
%이렇게 되면 들어올떄마다 0이되버리는데 static으로 global 필요x
sum = sum + x;
result = sum;
end
%}
result = accumulate( 5 ); %누적해서 결과를 보여주는거
disp(result);
result = accumulate( 3 );
disp(result);
result = accumulate( 2 );
disp(result);
function result = accumulate(x)
persistent sum; %c에서 static과 같은 기능
if isempty(sum) %처음 호출했을때는 0으로 초기화 다음에 불릴때는 초기화가 안됨
%처음 호출될때만 되는 방법
sum = 0;
end
sum = sum + x;
result = sum;
end
6장 연습문제
1.
a = [1 2 3];
b = [2 3 4];
prod = sum(a.*b)
%함수를 이용한 풀이
clear all;
a = [1 2 3];
b = [2 3 4];
prod = sum(a.*b); %내장함수를 이용한 풀이
prod1 = innerprod(a,b)
function prod1 = innerprod(a,b)
prod1 = 0;
for i=1:length(a)
prod1= prod1 + a(i)*b(i);
end
end
------------------------------
2번 skip 했던거임
------------------------------
3번
idea
10%2 ->0
10/2 -> 5
5%2 -> 1
5/2 -> 2
2%2 -> 0
clear all;
x= 20;
r = 2; %진법
convertNumber(x,r) %함수 호출 마지막에
function result = convertNumber(x,r)
result = []; %처음에는 빈 것으로 만들어준것
while( x>=r )
c = num2str(rem(x,r)); %문자열로 바꿈
result = strcat(c,result); %전에꺼에 문자를 붙임
x = floor(x/r);
%c에선 정수나누기 되는데 이렇게 되면 2.5니까 floor
end
result = strcat(num2str(x),result);
end
------------------------------
4-1)
>> ftn = @(x)(x-2)/(x^3+5*x) %익명함수 만들기
ftn =
다음 값을 갖는 function_handle:
@(x)(x-2)/(x^3+5*x)
>> ftn(10)
ans =
0.0076
>>
------------------------------
5-2) 인라인함수
>> ftn2 = inline('(x-2)/(x^3+5*x)');
>> ftn2(10)
ans =
0.0076
>>
---------------------------
6번 스킵
-------------------
7번 화씨 섭씨 변환
>> farhrenheit = @(celcius)((celcius*1.8)+32)
farhrenheit =
다음 값을 갖는 function_handle:
@(celcius)((celcius*1.8)+32)
>> farhreheit(30)
'farhreheit'은(는) 인식할 수 없는 함수 또는 변수입니다.
정정 제안:
>> farhrenheit(30)
ans =
86
>>
-------------------
8번 패스
-----------------
9번 최대공약수
getGCD(18,24) %이미 스크립트로 사용해서 save 눌러도 안나올때 걍 호출해서 사용
function gcd = getGCD(x,y)
r= min(x,y);
gcd = 1;
% ex) 12와 18의 최대공약수를 구하기 위해
for i = 2:r %여기서 r은 12가 되는거
if(rem(x,i)==0 && rem(y,i )==0)
gcd = i;
end
end
end
-----------------
10번 유클리드 호제법
getGCD(18,27) %이미 스크립트로 사용해서 save 눌러도 안나올때 걍 호출해서 사용
function gcd = getGCD(x,y)
small= min(x,y);
big = max(x,y);
while(rem(big,small) ~=0 )
r= rem(big,small);
big = small;
small = r;
end
gcd = small;
end
-----------------
11번
차집합 구하기
a= [1 2 3 4 5];
b= [2 4 5];
d = diffset(a,b)
function d = diffset(a,b)
d = [];
cnt = 1;
for i=1:length(a)
flag = 0;
for j=1:length(b) %이중문으로
if a(i) == b(j)
flag =1;
break;
end
end
if flag == 0
d(cnt) = a(i);
cnt = cnt+1;
end
end
end
7장 구조체
%셀배열 : 기존과 다르게 구성할때 각 엘리먼트들이 다른 타입이여도 됨
% cArray= { 12,'abcdef'; [2 8 5], [15;83] } 이런형태
cArray = {12, 'abcd';[ 2 8 9], [1 5;8 3]};
disp(cArray)
실행결과
>> untitled7
{[ 12]} {'abcd' }
{[2 8 9]} {2×2 double}
>>
cellplot(cArray) %결과를 그래픽으로 보여줌
celldisp(cArray)
% 실행결과
>> untitled7
cArray{1,1} =
12
cArray{2,1} =
2 8 9
cArray{1,2} =
abcd
cArray{2,2} =
1 5
8 3
>>
-----------------------
cellA = cell(2,2);
cellA
>> untitled7
cellA =
2×2 cell 배열
{0×0 double} {0×0 double}
{0×0 double} {0×0 double}
>>
cellA = cell(2,2);
celldisp(cellA) %빈 셀이 만들어짐 여기에 데이터를 집어넣는건 인덱싱과 컨텐츠 방법 나중에 설명함
>> untitled7
cellA{1,1} =
[]
cellA{2,1} =
[]
cellA{1,2} =
[]
cellA{2,2} =
[]
cellA = cell(2,2);
cellA{1,1} =24
cellA{1,2} = magic(3)
celldisp(cellA)
---------------------------
%셀인덱싱과 컨텐츠 인덱싱 셀배열이름{} -> 컨텐츠인덴싱, 셀배열이름()-> 셀인덱싱
cellB = cell(2,2);
cellB{1,1} = 20; %컨텐츠 인덱싱임
cellB(2,2) = {pascal(2)};
%아까는 cellA 에서 {} 썼음 대신 인덱싱하는 요소에 중괄호 필요함
%셀 인덱싱임
---------------------------
cellA{1,1}
cellA(1,1)
>> untitled7
ans =
24 %값이 나옴 -> 컨텐츠 인덱싱을 썼으면 내용이 바로 나오는거
ans =
1×1 cell 배열
{[24]} %엘리먼트들이 셀로 나옴
>>
---------------------------
cellA{1} = 1;
cellA{2} = 2;
cellA = cell(100,1)
%이렇게 정의해주면 빈셀을 만든거지만 이렇게 해줘야 여러셀을 만들때 속도가 빨라짐
cellA{1,2} = 5
>> cellA{1} = 3;
cellA{2} = magic(3);
cellA{3} = 'abc';
cellA{4} = cellA{2};
cellA{4} = cellA{2};
cellA{4} = cellA{2};
>> cellA{5} = cellA(2); -> 이거는 cellA{6} = {cellA{2}}; 와 같은 의미
-------------------
개념
cellA{2} = 2번째 셀의 내용이 나옴
cellA(2) = cellA의 2번째 요소의 셀
둘이 같은 의미긴함
cellA(8) = cellA(2) %셀A에 8번 셀을 2번셀과 똑같이 만들겠다는거 활용 {}를 썼으면 {}로, ()->()로 내용물을 똑같이 만드는 방법 2가지임
그런데 중요
cellA{11} = cell(2); %셀A의 11번째 내용이 -> cell(2)가 되는거
cellA(12) = cellA{2} %이렇게 되면 이건 안됨 but 가능하게 되는 방법 내용물을 셀로 바꾸면 가능함
cellA(12) = {cellA{2}} %이렇게 해야함
cellA{13} = cellA(2);
cellA(14) = cellA{13}
----------------------
clear all;
A = {'abc', [1 2 3], 33};
A{2}
결과 :
>> untitled7
ans =
1 2 3
-----------------------
A{2}(3)
>> untitled7
ans =
1 2 3
ans =
3
>>
A{1}(2)
ans =
'b'
----------------------
A = {'abc',{[2 7],24,'def'},30}
아래의 문장과 값이 다름
A = {1,'abc',{[2 7],{24},'def'},30}; 요소들로 연산하기
A{3}{2}{1} ->24
-----------------------
구조체
%구조체
car.model = 'sonnata';
car.year = 2020; %연식
car.plate = '12아 1234'; %번호판
%이렇게만 하면 구조체가 만들어진거
car.type ='diesel'; %나중에도 추가 및 변경가능 c와의 차이점
year = car.year %2020 결과 나옴
>> untitled7
car =
다음 필드를 포함한 struct:
model: 'sonnata'
year: 2020
plate: '12아 1234'
>>
%한번에 만들기
clear all;
car = struct('model', 'sonnata', 'year', 2020,'plate','12아 1234')
car.type ='diesel'; %나중에 추가도 가능 즉 함수의 틀자체를 바꿀필요가 없어 편함
car.type = 'gasolin';
setfield(car.'type','diesel') %함수로 바꾸기 근데 그냥 위에처럼 바꾸는게 편해서 잘안씀
-------------------
clear all;
car = struct('model', 'sonnata', 'year', 2020,'plate','12아 1234')
car.type ='diesel';
car.type = 'gasolin';
car = setfield(car,'type','diesel'); %셋필드로 추가하는 방법
car = setfield(car,'color','red');
car
car = rmfield(car,'plate') %없애기
fieldnames(car)
ans =
4×1 cell 배열
{'model'}
{'year' }
{'type' }
{'color'}
isfield(car,'year') %car에서 year가 있느냐 참 거짓 1 0으로 알려줌
%isfield를 이용한 함수 만들기
clear all;
car.color = 'red';
car.model = 'sonnata';
car.year = 2020;
car.type ='hybrid';
result = isallfield(car,{'year','model'})
function result = isallfield(st,field )
r =isfield(st, field);
result = all(r);
end
결과 : 1
근데 model 대신 plate 면 0
요소 전부 다 있을때만 1
반대로 맨아래 문장에 all대신 any면 1개라도 있으면 참이되는 함수임
%구조체 배열
myCar(1) = car;
myCar(1)
myCar(2) = car;
ans =
다음 필드를 포함한 struct:
color: 'red'
model: 'sonnata'
year: 2020
type: 'hybrid'
>> untitled7
y =
2020
ans =
다음 필드를 포함한 struct:
color: 'red'
model: 'sonnata'
year: 2020
type: 'hybrid'
>>
y=car.year
%결과 y=2020
y= getfield(car,'year'); %같은의미
%구조체 배열
myCar(1) = car;
myCar(1)
myCar(2) = car;
myCar(3) =struct('model','avante','year',2022,'type','gasolin','color','red');
myCar(4) =struct('model','GV80','year',2023,'type','gasolin','color','black');
myCar(5) =struct('model','GV80','year',2023,'type','gasolin','color','black','plate','12아1234');
myCar %5번은 안됨 같은 필드를 가져야 배열을 쓸 수 있는거
myCar(3).model %'avante' 출력됨
--------------------
%공학예제
이름 순서 정렬 -> 버블 소팅 예제
N=4;
name = cell(N,1);
for n=1:N
name{n} = input('이름을 입력하세요:','s'); %입력받은게 문자니까
end
%만약 name(n)이면 뒤에를 {}로
% 그 다음 버블sorting
M= length(name);
for i=1:M
for j=i+1:M
if(name{i}(1) > name{j}(1)) %첫번째 글자(1) 비교해서 크면 교환할꺼임
temp = name{i}; %바꾸는 방식 temp로 저장했다가 바꿔야함 삼각형으로
name{i} = name{j};
name{j} = temp;
end
end
end
for i=1:M
fprintf('%s\n',name{i});
end
>> untitled7
이름을 입력하세요:aaa
이름을 입력하세요:bbb
이름을 입력하세요:ggg
이름을 입력하세요:eee
aaa
bbb
eee
ggg
>>
--------------------
%7장 연습문제
%{
1번
clear all;
a.real =3;
a.imag =2;
b.real =-1;
b.real =5;
%c.real = a.real +b.real;
%c.imag = a.imag +b.imag;
%c= complexMult(a,b);
c= complexdiv(a,b);
fprintf("c= %.4f+%.4fi\n",c.real,c.imag);
function [real, imag] = complexMult(a,b)
c.real = a.real*b.real - a.imag*b.imag;
c.imag = a.real*b.imag + a.imag*b.real;
end
function c =complexconj(a)
c.real = a.real;
c.img = -a.imag;
end
function mag = complexMagnitude(a)
mag = sqrt(a.real*a.real + a.imag*a.imag);
function c =complexdiv(a,b)
mag_sq = complexMagnitude(b).^2;
c = complexMult(a,complexconj(b));
c.real = c.real/mag_sq;
c.imag = c.imag / mag_sq;
end
%}
%{
2번
cellA = {[3:2:5]},'abc','A',45};
cellA{1}(2)
cellA = {[3:2:5]},'cell Array','a',45};
cellA{2}(6) == cellA{A}
cellA{{'jameskim','angelina'}, {2,[4,5]}};
cellA{1}{2}(2:4)
%}
%7장 연습문제
%{
1번
clear all;
a.real =3;
a.imag =2;
b.real =-1;
b.real =5;
%c.real = a.real +b.real;
%c.imag = a.imag +b.imag;
%c= complexMult(a,b);
c= complexdiv(a,b);
fprintf("c= %.4f+%.4fi\n",c.real,c.imag);
function [real, imag] = complexMult(a,b)
c.real = a.real*b.real - a.imag*b.imag;
c.imag = a.real*b.imag + a.imag*b.real;
end
function c =complexconj(a)
c.real = a.real;
c.img = -a.imag;
end
function mag = complexMagnitude(a)
mag = sqrt(a.real*a.real + a.imag*a.imag);
function c =complexdiv(a,b)
mag_sq = complexMagnitude(b).^2;
c = complexMult(a,complexconj(b));
c.real = c.real/mag_sq;
c.imag = c.imag / mag_sq;
end
%}
%{
2번
cellA = {[3:2:5]},'abc','A',45};
cellA{1}(2)
cellA = {[3:2:5]},'cell Array','a',45};
cellA{2}(6) == cellA{A}
cellA{{'jameskim','angelina'}, {2,[4,5]}};
cellA{1}{2}(2:4)
%}
%{
4번
clear all;
person = cell(3,4);
for i =1:3
for j=1:4
if(j==1) %문자 입력과 정수입력을 구분해줘야함
person{i,j} = input('name: ', 's');
else
person{i,j} = input('intege:');
end
end
end
celldisp(person);
%}
%{
5번 위에 문제를 구조체로 바꾸기
clear all;
for i =1:3
person(i).name = input('name:','s');
person(i).number = input('number:');
person(i).height = input('height:');
person(i).weight= input('weight:');
end
for i=1:3
disp(person(i));
end
clc;
clear;
person=cell(3,4);
for i=1:3
person{i}.name = input('name :','s');
person{i}.number = input('number :','s');
person{i}.height = input('height :','s');
person{i}.weight = input('weight :','s');
end
fprintf('%-10s\t%-10s\t%-10s\t%-10s\n','Name','Number','Height','Weight');
for i=1:3
fprintf('%-10s\t%-10s\t%-10s\t%-10s\n',person{i}.name,person{i}.number,person{i}.height,person{i}.weight);
end
%}
%{
6번
circle.x = 0;
circle.y = 0;
circle.r = 10;
p.x =10/sqrt(2);
p.y =10/sqrt(2);
dist = sqrt( (p.x - circle.x).^2 +(p.y - circle.y).^2);
if dist < circle.r
disp('원 내부에 있습니다');
else
disp('원 외부에 있습니다');
end
%}
#계산기
function[result] = gaesan(x,y,z)
if z=='+'
result = getplus(x,y);
elseif z=='-'
result = getminus(x,y);
elseif z=='*'
result = getmulti(x,y);
else
result = getdiv(x,y);
end
end
function plus = getplus(x,y)
plus = (x+y);
end
function minus = getminus(x,y)
minus = (x-y);
end
function multi = getmulti(x,y)
multi = (x*y);
end
function div = getdiv(x,y)
div = (x/y);
end
8장 그래프
**x = linspace(1,50,20);**
**y = x.^2; →먼저 정의 하고 plot부르기**
**plot(x,y) → 여기서 x,y는 각각 좌표값을 가지는 벡터**
**plot(x,y, ’d k -.’ )**
라벨넣기 → xlabel(’문자열’) , ylabel(’문자열’)
제목넣기 title(’문자열’)
텍스트 넣기 → text(x,y,’문자열’) → x,y는 들어갈 좌표
범례 legend
눈금선 → grid on
다중그래프(x,y,’기본속성값’, x1,x2,’기본속성값’)
hold on → 그래프 덧 그리기
subplot(n,m,p) → n:나눠질 행의 갯수, m은 열의 개수 , p가 중요한데 p는 행을 기준으로 가로로 숫자를 세서 들어갈 위치를 찾는거 1 2 3 4 순서임
ex) subplot(3,4,1)
fplot(@(x) ‘함수식’ , [x시작값 ,x의 끝값]) → 간단히 그래프 그리기
다양한 그래프 정리
- 막대 그래프
x=[1 2 3]
y=[2 4 5]
bar(x,y,막대의폭,color) →1,2,3에 막대 높이 2 4 5 생성
- 히스토그램
y= [1 2 5 7]
hist(y,n) →n은 구간의 개수 각 구간에 개수에 해당하는 y의 개수가 몇개인지 그래프 그려줌
- stairs(x,y,’기본속성값’) → 계단함수
- stem(x,y,’기본속성값’) → 화살표 줄기형 막대그래프
- 파이 그래프
pie(x,y) → x는 데이터, y는 분리를 위함 [1 0 0 1 0] → 1번째와 4번째를 분리함 제일 상단에 있는게 1번 번호는 반시계
- 로그축 그래프
semilogx(x,y)
semilogy(x,y)
loglog(x,y) → x,y 모두 상용로그로
- **극좌표 그래프**
r= cos(세타)^2+sin(세타) , 0≤세타≤ 2*pi
theta = linspace(0,2*pi)
r = 수식
polar(세타, r ,’기본속성값’)
---
3차원 그래프 → t를 매개변수로 정해서 x,y,z 정의하고 그리기
t = linspace(-5,5)
x = t . *sin(t)
y = cos(t)
z = t
plot3(x,y,z,’기본속성값’,’linewidth’,2)
- **관측점 설정하기**
view(Az,EL) → EL이 고도각 x,y 평면이 0도, AZ는 y의 음의 방향 시작
격자점 생성 → 입체 그물망 같은 그림 만들때 사용함
x = linspace(-2,2);
y = linspace(-2,2);
**[X,Y] = meshgrid(x,y) → 이거 먼저 하고 3차원 그리기**
격자점들에 대한 Z 수식 계산가능
Z = X.*Y
mesh(X,Y,Z, ‘기본속성값’)
표면 그래프 반 매쉬
meshz
표면 그래프 → surf(x,y,z)
등고선 → contour(X,Y,Z,N) → N은 등고선 갯수
그물망 그리고 그 밑에 등고선 그래프 → meshc(x,y,z)
surf(x,y,z) → 표면을 그리고 그 밑에 등고선을 그려줌
구 → [X,Y,Z] = sphere(N) → N은 구의 면의 갯수 ex) 100
scatter3(x,y,z) → 점 그래프
stem3(x,y,z), pie3(x,y), bar3(x,y) → 파이랑 바는 2차원과 입력인수 동일
---
- ***10장***
**polyval 함수**
p = [-2 3 10 -7 4]; 다항식의 계수고 반드시 0인 항도 생략하지 않고 표기한다.
polyval(p,10); → 위에 다항식에 10을 넣어 계산
**polyvalm** 함수 -> 얘는 매트릭스 x가 *정사각* 매트릭스여야한다. 즉 매트릭스 전체를 하나의 x값으로
보고 다항식 p에 대입해서 계산해줌 x^2 은 x매트릭스의 제곱을해주고
위에꺼랑
**차이점: ployval은 그냥 매트릭스안에 값들을 각각의 x로 간주하고 따로따로 다항식계산**
x=[1 2;2 1];
p=[1 1 1];
polyvalm(p,x);
- 다항식의 곱셈(전개식 함수) **conv(p1,p2)**
p1=[4 4 1]; %2차
p2=[1 3]; %1차
conv(p1,p2); % 곱셈 결과로 3차식나옴
- 식 나누기
[q r] = **deconv**(p1,p2); %몫과 나머지 2개로 받아줘야함
% q = 4 -8
% r = 0 0 25
%다항식의 덧셈 뺄셈시 주의점은 다항식의 차수를 같게 맞춰야함 어떻게? 최고차항에 0을 넣고
벡터 생성해주면 됨. 차수 낮은 식에
%roots(p) 식에서 → **방정식 근을 구하는 함수 -> roots(p)** 계산된 값을 열벡터로 반환
p1 = [1 5 4];
roots(p1);
- **poly(r) :** 거꾸로 근 → x의 다항식 구하기 전과 다를 수 밖에 없음 poly는 최고차항 계수가 1인 식의 근을 찾아주기 때문임.
r = ans;
- 비선형 방정식(sin(x)+exp(-x)) 이런식의 근 구하기 지정한 값에서부터 가까운 근을 반환
func = inline('0.5*x+sind(x)+0.1*exp(-x)-2'); -> 인라인함수 선언
**fzero(func,1)** %**1에서부터 찾아봐라** 왼쪽 오른쪽 둘다 출발하고 거기서 부터 **가장 가까운거 근**을 줌
%fzero(func,[-4 7])%오류가 뜨는 이유는 -4일떄도 함수값이 양수,7일때도 양수이기떄문 둘이 달라야함
fzero(func,[-4 0]);
fzero(func,[-3 7]);
- 미분 적분
p = [4 -9 7 4];
**polyder(p)**; %미분
p1 = [1 4 1];
p2 = [1 5];
**d = polyder(p1,p2); %곱의 p1 * p2 의 미분**
polyder(conv(p1,p2)); %다른 표현
**[n,d] = polyder(p1,p2);** %얘가 넘겨주는게 1개이면 곱셈의 미분, 2개면 나눗셈의 미분을 넘겨줌
**%적분 quad**
func = inline('x.*exp(x)');
**quadl(func,1,3)**; %1~3까지 정적분한 결과 L임
func = @(x) exp(x)./(2+sin(x));
quadl(func,0,2)
x= linspace(0,2,100); %1~2까지 100개 나눠 계산하려고
y= exp(x)./(2+sin(x));
trapz(x,y) -> quad, quadl,trapz싹다 적분인데 trapz는 입력인자로 함수를 받지x
- 근을 가장 만족하는 그래프 찾기 **polyfit**
x=1:8;
y=[19 54 174 431 628 977 1130 1401];
plot(x,y,'o','markerfacecolor','b');
grid on
ylim([-200,1500])
**p = polyfit(x,y,4)** %맨뒤 숫자는 다항식의 차수임.
ftn=@(x) 0.5928*x.^4-15.5139*x.^3+143.9754*x.^2-314.3465*x+208.1786;
%ftn=@(x) p(1)*x.^4+p(2)*x.^3+p(3)*x.^2+p(4)*x+p(5);
fplot(ftn,[0,9])
hold on
plot(x,y,'o','markerfacecolor','b');
%선형 보간법
x=[0 2 3 4 5 8 9 10];
y=[27 41 50 69 93 133 256 165]; →데이터 생성
xin = 0:0.2:10; → 보간법으로 계산할 데이터값
yin = interp1(x,y,xin,'linear'); → **메소드 여러개 있음 spline(x의 범위 밖을 가질수 있는 방법)**
plot(x,y,'o','markerfacecolor','b','markersize',10)
hold on
plot(xin,yin,'r.')
hold off
%{
close all;
clc;
clear all;
time =[0 10 25 45 50 70 93 105 117 130];
velocity= [0 20 35 30 70 75 100 89 115 123];
y= interp1(time,velocity,x,'linear');
plot(time,velocity,'o','markerfacecolor','b')
hold on
grid on
plot(x,y,'r.','linewidth',2)
%}