소개
게시글
질문&답변
2024.04.20
linear independence이라면 왜 one-to-one인가요?
Matrix A의 Column들이 linearly independent 하다는 것은 if and only if A가 one-to-one mapping입니다. 증명은 여러 가지로 많이 소개되어있으니 직접 찾아보시면 되겠습니다. 제가 이 동치를 직관적으로 이해하는 방법은 아래와 같습니다. 우선 one-to-one의 linear mapping에서의 직관적 의미부터 되새겨봅시다. A가 one-to-one mapping이라는 것은 Ax = b에서 서로 다른 x가 각각 서로 다른 b로 mapping 된다는 뜻입니다. 여기서 Column들의 linear independence 의 linear mapping 에서의 의미를 되새겨봅시다. Column들의 linear independence는 A의 Column들 중 어느것도 서로 다른 column들의 linear combination으로 표현될 수 없다는 뜻입니다. 반대로, column 들이 linearly dependent하다면, 어떤 column은 다른 column들의 linear combination으로 표현됩니다. 여기서, i번째 column이 vector x의 i번째 element 를 mapping 하는 것임을 상기해보면 (1.8 강의 standard matrix 부분을 보시면 됩니다), linearly dependent 하다면, vector x의 '어떤 element k'가 mapping되는 결과는 vector x의 다른 element가 mapping 된 것의 조합으로 표현됩니다. 따라서, element k는 어떻게 결정되어도 상관없는 free variable이게 됩니다. 따라서, one-to-one이지 않습니다. 이의 대우로, one-to-one이면 linearly independent하게 됩니다. 조금 rough하게 적어서 엄밀한 설명은 아닙니다만, linear independence와 one-to-one이 linear map에서 어떤 관계가 있는지 이해하시는데에 도움이 되었으면 합니다 :)
- 0
- 2
- 412
질문&답변
2020.09.12
1.6 {u,v,w} in R^3 질문드립니다
아 생각보다 간단한 거였네요 ㅎㅎ 이해됐습니다. 감사합니다!
- 1
- 2
- 200
질문&답변
2020.08.06
while (scanf(
부족한 제 설명이 도움이 됐다니 다행입니다 :)
- 2
- 8
- 1K
질문&답변
2020.08.05
질문있습니다!
IDE마다 달라질 수 있겠으나, 보통 주소의 크기는 32bit 환경에서 4byte, 64bit 환경에서 8byte입니다. 64bit로 실행하신게 아닐까 추측해봅니다 :)
- 1
- 1
- 352
질문&답변
2020.08.05
while (scanf(
**오류 발견 시 지적 부탁드립니다.** 조금 까다로운 부분인데, 최대한 이해되도록 설명해보겠습니다. scanf("%[^\n]%*c", input) 에서 빈 엔터를 입력하면 %[^\n]에 의해 scanf는 아무것도 읽어들이지 않습니다. \n 전까지 읽어야하는데, 첫 문자가 \n이니 작동하지 않는거죠. 따라서, while 문 검사에서 계속 빈 엔터를 마주치니, %[^\n]에 의해 scanf가 아무것도 읽어들이지 않고, 그렇기에 애초에 %*c 작동으로 이어지지 않는 겁니다. 그렇다면, %*c는 도대체 왜 필요할까? 아래의 단순한 코드를 실행해봅시다. #define _CRT_SECURE_NO_WARNINGS #include int main() { char input1[10]; scanf("%[^\n]", input1); printf("%s checked", input1); } 분명 이 코드에서는 scnaf 안에 %*c가 없습니다. 그러나 %*c가 있는 코드와 동일하게 동작합니다. scanf 안을 바꿔가면서 실행해보세요 그런데 아래의 코드를 실행해보시면, %*c가 있고 없음에 따라 결과가 달라집니다 #define _CRT_SECURE_NO_WARNINGS #include int main() { char input1[10]; char input2[10]; scanf("%[^\n]", input1); scanf("%[^\n]", input2); printf("%s checked", input1); printf("%s checked", input2); } 이 코드에서 abc를 입력하면 아래와 같은 결과가 나옵니다 (사진) 이때 디버거로 주소를 확인해보면 아래와 같은 상태가 됩니다 (사진) 즉, input1을 받고나서 버퍼에 남은 \n 때문에 input2를 받는 scanf가 제대로 실행되지 않고 출력시에 input1은 정상적으로 출력되지만 input2를 출력하려고 하니 문자열 끝의 \0 이 없고 쓰레기 값을 계속 출력하다가 input1의 메모리까지 침범해서 input1 끝의 \0을 만나서야 printf가 끝나는 모양새입니다 이 코드에서 원래와 같이 %[^\n]%*c 를 사용하면, input1 input2 모두 정상적으로 입력받을 수 있습니다. 따라서 정리하자면 이렇습니다 %*c는 버퍼에 남아있는 \n을 비워주는 역할이 맞다. 정확히는, 마지막 문자인 \n을 버퍼로부터 읽어들이지만, 없는셈 치고 문자열에는 입력해주지 않는 것입니다. 그러나, [Enter]만 입력했을 경우 &[^\n]에 의해 scanf가 애초에 읽어들이지 않으므로 %*c가 작동하지 않았다는 것입니다. -답변이 도움이 되셨다면 좋아요를 눌러주세요!-
- 2
- 8
- 1K