행렬 계산하는 프로그램 사용할 사람이 있을까요?

dltkddyd의 이미지

행렬 계산할 수 있는 프로그램을 만들었습니다. 행렬의 덧셈, 곱셈, 실수배 대입과 같은 기본적인 연산을 할 수 있도록 하였고 초기 값 설정도 간단하게 할 수 있도록 했습니다.

초기화는 다음과 같이 합니다.

Matrix<int> obj1(3,2);//3*2행렬을 위한 메모리 할당
obj1(1,2,  3,4,  5,6);//행렬에 값을 설정
/*
1  2
3  4
5  6
*/
//이런 식으로 값이 설정됩니다.
 
Matrix<int> obj2(2,4);
obj2(5,6,7,8,  9,10,11,12);
/*
5   6   7   8
9 10 11 12
*/
//이런 식으로 값이 설정
 
Matrix<int> obj3=obj1*obj2;
/*
obj3의 값은
23  26  29      32
51  58  65      72
79  90  101  112
로 설정됩니다.
*/

클래스로 만들었습니다. 이런 행렬 라이브러리 구매해서 사용할 사람이 있을까요? 유용한까요? 유용하다면 어떤 사람들이 저걸 사용하려 할까요?

kaeri17의 이미지

C++ Eigen 라이브러리를 찾아보세요. 기본적인 곱셈기능만 있는 라이브러리면 다른 오픈소스 라이브러리들을 마다하고 쓸 이유가 있을것 같지는 않네요.

dltkddyd의 이미지

저건 기본적인 예시이고요. +, - 연산 대입연산 = 도 가능합니다. 아래 코드처럼 말입니다.

Matirx<int> obj1(2,3);
obj1(2,3,4,  5,6,7);
Matrix<int> obj2(2,3);
obj2(10,11,12,  13,14,15);
Matrix<int> obj3=obj1-obj2;
obj3=obj1+obj2;
cout<<obj3[1][2]<<endl;

C++ Eigen이라는 것 한 번 찾아봤는데. 값을 설정하는 방식이 좀 불편하군요. 그다지 구조적으로 잘 설계된 것 같진 않네요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

kaeri17의 이미지

구조적으로 잘 설계된것 같지 않다라... 일단 Modern C++ Design, Scientific and Engineering C++을 보시고, 저 설계가 왜 최적이 아닌지를 다시 한번 생각 해 보시면 좋겠네요. Eigen라이브러리는 제가 본 행렬 라이브러리 중에, 가장 쓰기 편하고 빠른 라이브러리입니다.

dltkddyd의 이미지

저도 배열 방식으로 값 집어넣는 방식을 구현해봤지만 그 방식은 메모리를 중복해서 사용한다는 단점이 있습니다. 다른 방식으로 행렬의 각 요소를 초기화하는 방식이 가능한데, 그런 방식으로 초기화 하는 방식은 없던데요. 그러니까 처음부터 각 요소의 값을 언급하는 방식으로 행렬을 초기화하는 것 말입니다. 저는 처음부터 아예 값으로 초기화하는 방식이 지원되도록 행렬을 구현했습니다.
그리고 말씀하신 행렬은 각 요소에 접근시에는 operator[]가 직관적인데도 operator()로 접근하는 방식을 취하고 있고요. 행렬은 2차원이잖아요. 이거 그리 어려운 것도 아닌데요. 왜 operator[]이 아니라 굳이 operator()을 사용했는지? 혹시 operator[]을 다른 용도로 사용하기 때문에 operator()로 접근하는 방식을 취할 수 밖에 없었는지 궁금하군요.
답변주신 내용 알아봐야 겠습니다. 지금 정렬방식 다루느라 무지 바쁘네요. 남 쉽게 생각하는 것을 어렵게 공부하고 있는 중이거든요. 여하튼 조언 감사드립니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

마잇의 이미지

기존의 라이브러리와 같은 일을 하는데 당신의 라이브러리는 어떤 장점이 있습니까에 대해서 객관적인 담을 하시면 됩니다.

같은 일을 하지만 인터페이스가 더 편하다.

같은 일을 수행할 떄 더 빠르다.

기존의 사용되어지고 있는 라이브러리를 깔 필요는 없습니다.


--
마잇

klara의 이미지

선형대수 라이브러리라면 모를까 그냥 행렬의 사칙연산을 위해 돈주고 사는 사람은 없을겁니다.

dltkddyd의 이미지

가우스소거법을 사용해서 방정식의 해를 구하는 것을 말씀하시는 건가요? 이거 만들려면 오늘 하루 날 잡아서 만들 수 있는데요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

klara의 이미지

어떤 기능이 필요한지 궁금하시면 LAPACK이나 BLAS 스펙을 읽어보세요.
당연히 언급하신 1차 연립방정식 풀기도 들어가지만 아무도 이걸 구현하기 위해서 가우스 소거법은 쓰지 않습니다. 너무 느리거든요.

나그네나그네의 이미지

이런 쪽 라이브러리의 생명은 속도인지라..

아마 이미 나와있는 라이브러리의 행렬곱셈이라던지 inverse, eigenvector 계산 속도를 따라잡기는 힘들겁니다

세벌의 이미지

얼마에 팔려고요?

snowall의 이미지

100만 x 100만 행렬의 계산 같은걸 쉽게 할 수 있다면 불티나게 팔릴겁니다. 저정도 규모를 갖는 행렬의 사칙연산이나, 역행렬 계산이나, 고유값 고유벡터 계산이라든가, 등등.

저정도 규모 행렬에서 성능이 얼마나 나오나요?

피할 수 있을때 즐겨라! http://melotopia.net/b

wisepocket의 이미지

행렬 같은 경우 워낙 라이브러리가 많아서 팔기 힘들죠... 3D 분야에서는 다이렉트나 오픈지엘 파이프라인 행렬을 이용하고 오브젝트 이동, 회전, 스케일 또한 행렬을 이용합니다.
고차 방정식 해를 구할때도 행렬의 사용하고요. 암호화와 관련되어서도 이용됩니다. 행렬은 컴퓨터 연산하고 궁합이 잘 맞아서 복잡한 연산을 쉽게 바꾸고 또 계산 결과가 누적되는
효과가 있어서 아주 유용하게 쓰인답니다. 위에서 이는 기능으로는 절대 팔 수 없습니다...

dd

sshtel의 이미지

수학 연산 라이브러리에서는 문제 자체가 문제라기 보단..
문제 처리 속도가 문제입니다...
단순히 결과를 낸다고 좋은 라이브러리가 아닙니다.
처리 속도를 최적화 하기 위해 엄청난 노력을 합니다.

생각을 해보세요.
수학 함수라는게 이미 입력에 대해 어떠한 답을 내놔야 할지 모두가 알고 있는 것입니다.
단순히 결과를 낸다고 가치가 생기는 것이 아닙니다.
가치, 이익이라는 것은 남들이 못하는 문제를 풀 때 생깁니다.

수학 라이브러리를 만들어 팔고 싶다면 이 부분에 관심을 가지셔야 할 것 같습니다.
수학에 상당한 자신이 있으신거 같은데 그것을 기반으로 남들이 풀지 못하는(빠른 연산) 문제를 풀면 좋을 것 같습니다.

sonsure의 이미지

나라면 MATLAB쓰겟소

마잇의 이미지

그런 경험들 한 번 얘기해 주시죠.

기존에 사용하던 라이브러이에서 다른 라이브러리로 넘어간 경우

이런 거 뭐 딱히 이유 없이 넘어갈 때도 있지 않습니까?


--
마잇

mirheekl의 이미지


항상 프로젝트에서 기존에 사용하던 게 있었기 때문에. 이런건 이유없이는 바꿀 수가 없지요.

업뎃이 중단됐다거나, 고쳐지지 않은 보안 문제가 있다든지 등등.

기존에 쓴 적이 없는 쪽의 새로운 무언가를 사용한다면야 선택의 자유가 생길 수도 있지만 이건 바꾼다고 할 수 없는 것이고.

--

jinmyung.won의 이미지

수치 연산 라이브러리에는 속도 뿐만 아니라, 절단 오차(truncation error)를 어떻게 처리하느냐도 중요한 이슈가 됩니다. 디지털 컴퓨터가 실수를 완벽하게 처리할 수 없기 때문에 여러가지 자잘하게 고려해야 할 점들이 있습니다. 작은 오차라도 누적이 되면 완전히 다른 결과를 도출하기 때문이죠. 검증된 라이브러리를 사용해야 하는 또 다른 이유입니다.

dltkddyd의 이미지

맞아요. 누적 오차의 문제 정말 심각하죠. 컴퓨터는 또 이진수로 처리하기 때문에 10진수와 이진수의 차이에서 오는 문제들도 있고요. 결국 기존의 것과 비교해서 문제는 속도와 정확성이군요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

yeonpil_net의 이미지

A X B
를 위해 그냥
matmul(a, b)
하면 됩니다.
dot_product도 있고..

뭐 모든 컴파일러에서 기본 라이브러리안에 제공되어야 할 기능이고, 뭐 딱히 별다를 것도 없죠.
아 정수배열이어도, 실수배열이어도, 복소수 배열이어도 됩니다. 제너릭함수로 정의되어 있어서.

!23456---1----+----2----+----3----+----4----+----5----+----6----+----7-2--+----8
"배웠다"는 "할 수 있다"의 동의어가 아니다.

khi8660의 이미지

일반 위의 방식자체가 템플릿을 완전하게 사용하시지 않아서 기존 라이브러리보다 느릴거 같구요..

내용을 보지 않았지만, 메모리배열도 최적화되어 연산하고 있지 않다고 봅니다.

솔직히 c++중급만 되도 operator 잘 써서 모양 이쁘게 매트릭스 누구나 만들수 있어요..

그래서 오픈소스로 이런거 만드는 데가 많은데요. 님도 판매보다는 Open Source 하시는게 오히려 도움이 될겁니다..

지금은 얼리언엔진4도 오픈소스인 시대입니다...

요즘 그리고 cpu 행렬연산보다는 GPGPU로 넘어가는 추세입니다..

여하튼 이런 수치연산용 라이브러리는 진짜 엄청난 노하우가 있지 않으면, 판매가 힘듭니다....

그냥 응용프로그램 만들어서 판매하시거를 생각하는게 나을거 같아요..

dltkddyd의 이미지

속도 빠른 좋은 라이브러리가 많다. 이 쪽은 속도가 관건이다. 그러니 빨라야 한다. 100만x100만 행렬 못 만들건 없지만 속도가 다른 라이브러리보다 빨라야 한다는 말씀.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.