프로그래밍 언어

22_상반기_matlab_기초

top-engineer 2024. 8. 1. 15:25

 

기본 연산 함수

 

더보기


>> 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)
%}