28 float Inf=3.4*pow(10,38);
36 float max=3.4*pow(10,38);
38 float min=3.4*pow(10,38);
51 矩阵(
int _h,
int _w,
float value){
63 矩阵(
int _h,
int _w,
矩阵 value){
76 矩阵(
int _h,
int _w,
float * init_data,
bool COPYARRAY){
94 矩阵(
int n,
float value){
100 for(
int i=0;i<
N;i++){
111 for(
int i=0;i<
N;i++){
118 for(
int i=0;i<
N;i++){
125 for(
int i=0;i<
N;i++){
128 t1=round(t1*pow(10,n));
142 矩阵* 单位=
new 矩阵(
h,
w,(
float)0);
146 for(
int i=0;i<
h;i++){
150 float norm= pow((*和值)[i],0.5);
154 for(
int j=0;j<
w;j++){
155 单位->
data[i*
w+j]=(行果)[j];
163 矩阵*
和=
new 矩阵(1,1,(
float)0);
164 for(
int i=0;i<
N;i++){
174 和=
new 矩阵(1,
w,(
float)0);
175 for(
int i=0;i<
h;i++){
176 for(
int j=0;j<
w;j++){
177 (*和)[j]+=
data[i*
w+j];
182 和=
new 矩阵(
h,1,(
float)0);
183 for(
int i=0;i<
h;i++){
184 for(
int j=0;j<
w;j++){
185 (*和)[i]+=
data[i*
w+j];
190 cout<<
"仅支持对 0 或者 1 维的和操作";
200 (*minmax)[1]=排序->
data[
N-1];
201 (*minmax)[0]=排序->
data[0];
210 for(
int i=0;i<
w;i++){
213 矩阵* 排序=(*this)[ss.str()];
221 for(
int i=0;i<
h;i++){
224 矩阵* 排序=(*this)[ss.str()];
231 cout<<
"维度只能是 0 或者 1";
239 行=
new 矩阵(1,
L,(
float)0);
240 for(
int i=0;i<
L;i++){
249 坐标阵[0]=
new 矩阵(1,行x->
w,行x->
data,1);
250 坐标阵[1]=
new 矩阵(行y->
w,1,行y->
data,1);
252 for(
int i=1;i<行y->
w;i++){
253 坐标阵[0]=this->
r_(坐标阵[0],行x);
255 for(
int i=1;i<行x->
w;i++){
257 坐标阵[1]=this->
c_(坐标阵[1],行y转置);
266 cout<<
"下标超出范围了"<<endl;
278 unsigned long L=ij.length();
279 for(
int i=0;i<
L;i++){
281 int_ij+=tmp*pow(10,
L-i-1);
288 string teststr=
"1234";
289 cout<<teststr<<
"="<<
str2int(teststr)<<endl;
291 cout<<teststr<<
"="<<
str2int(teststr)<<endl;
298 assert(矩阵1->
h==矩阵2->
h);
299 矩阵* 矩阵3=
new 矩阵(矩阵1->
h,矩阵1->
w+矩阵2->
w,-2);
300 for(
int i=0;i<矩阵1->
h;i++){
301 for(
int j=0;j<矩阵1->
w;j++){
305 for(
int i=0;i<矩阵2->
h;i++){
306 for(
int j=0;j<矩阵2->
w;j++){
307 矩阵3->
data[i*矩阵3->
w+j+矩阵1->
w]=矩阵2->
data[i*矩阵2->
w+j];
316 assert(矩阵1->
w==矩阵2->
w);
317 矩阵* 矩阵3=
new 矩阵(矩阵1->
h+矩阵2->
h,矩阵1->
w,-2);
318 for(
int i=0;i<矩阵1->
h;i++){
319 for(
int j=0;j<矩阵1->
w;j++){
323 for(
int i=0;i<矩阵2->
h;i++){
324 for(
int j=0;j<矩阵2->
w;j++){
325 矩阵3->
data[(i+矩阵1->
h)*矩阵3->
w+j]=矩阵2->
data[i*矩阵2->
w+j];
333 assert(this->w==矩阵1.
w);
334 assert(this->h==矩阵1.
h);
335 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
336 for(
int i=0;i<
w;i++){
337 for(
int j=0;j<
h;j++){
345 template <
typename T>
347 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
353 assert(this->w==矩阵1.
w);
354 assert(this->h==矩阵1.
h);
355 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
356 for(
int i=0;i<
w;i++){
357 for(
int j=0;j<
h;j++){
365 template <
typename T>
367 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
373 assert(this->w==矩阵1.
w);
374 assert(this->h==矩阵1.
h);
375 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
376 for(
int i=0;i<
w;i++){
377 for(
int j=0;j<
h;j++){
385 template <
typename T>
387 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
392 assert(this->w==矩阵1.
w);
393 assert(this->h==矩阵1.
h);
394 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
395 for(
int i=0;i<
w;i++){
396 for(
int j=0;j<
h;j++){
404 template <
typename T>
406 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
412 assert(this->w==矩阵1.
w);
413 assert(this->h==矩阵1.
h);
414 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
415 for(
int i=0;i<
w;i++){
416 for(
int j=0;j<
h;j++){
427 template <
typename T>
429 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
435 assert(this->w==矩阵1.
w);
436 assert(this->h==矩阵1.
h);
437 矩阵* 果=
new 矩阵(
h,
w,(
float)0);
438 for(
int i=0;i<
w;i++){
439 for(
int j=0;j<
h;j++){
451 template <
typename T>
453 矩阵* 矩阵1=
new 矩阵(
h,
w,value);
464 for(
int i=0;i<
w;i++){
465 for(
int j=0;j<
h;j++){
506 for(
int i=0;i<count;i++){
507 int value=va_arg(v,
int);
512 多行矩阵=
r_(多行矩阵,
行(value));
524 for(
int i=0;i<count;i++){
525 int value=va_arg(v,
int);
530 多列矩阵=
c_(多列矩阵,
列(value));
539 unsigned long dou_i=ij.find(
",",0);
540 unsigned long dimention_i=ij.find(
":",0);
541 unsigned long dimention_ri=ij.rfind(
":",ij.length());
545 if(dimention_i<dimention_ri){
547 if(dou_i-dimention_i==1){
549 int 始列=
str2int(ij.substr(dou_i+1,dimention_ri-dou_i-1));
550 int 终列=
str2int(ij.substr(dimention_ri+1,ij.length()-1-dimention_ri));
551 for(
int i=始列;i<终列;i++){
558 子矩阵=
c_(子矩阵,
operator[](ss.str()));
564 if(dou_i-dimention_i>1){
566 int 始行=
str2int(ij.substr(0,dimention_i));
567 int 终行=
str2int(ij.substr(dimention_i+1,dou_i-dimention_i-1));
568 for(
int i=始行;i<终行;i++){
575 子矩阵=
r_(子矩阵,
operator[](ss.str()));
583 unsigned long L=ij.length()-1;
586 if(dimention_i<dou_i && dimention_i>=0){
588 int j =
str2int(ij.substr(dou_i+1,
L-dou_i));
590 维= (
new 矩阵(
h,1,(
float)0));
591 for(
int i=0;i<
h;i++){
597 if(dimention_i>dou_i && dimention_i<=
L){
598 维=
new 矩阵(1,
w,(
float)0);
600 int i =
str2int(ij.substr(0,dou_i));
601 for(
int j=0;j<
w;j++ ){
606 int i=
str2int(ij.substr(0,dou_i));
607 int j=
str2int(ij.substr(dou_i+1,
L-dou_i));
619 for(
int i=0;i<m.
h;i++){
621 for(
int j=0;j<m.
w;j++){
623 cout<<m.
data[i*m.
w+j];
624 if(j<m.
w-1){cout<<
",";}
628 if(i<m.
h-1){cout<<
","<<endl;}
643 float&
取(
int i,
int j){
基本的矩阵计算类,用于完成各种矩阵初始化、最大最小、取值、加减乘除、精度设置等矩阵计算
矩阵(int _h, int _w, 矩阵 value)
复制矩阵
矩阵(int _h, int _w, float *init_data, bool COPYARRAY)
矩阵 * c_(矩阵 *矩阵1, 矩阵 *矩阵2)
friend ostream & operator<<(ostream &out, 矩阵 &m)
矩阵 * arange(int start, int end)
模仿numpy 的arange
float & operator[](int i)
void 精度(int n=5)
设置矩阵内的数据精度,小数点后保留5位
矩阵(int n, float value)
初始化一个1行,n列的向量
矩阵 * 和(int dim)
按行求和,或者按列求和,dim=0是按列求和,dim=1是按行求和
矩阵 * r_(矩阵 *矩阵1, 矩阵 *矩阵2)
按行合并
矩阵(int _h, int _w, float value)
初始化一个值为value的矩阵
矩阵 * minmax(void)
求矩阵中所有元素的最大值,最小值
矩阵 ** meshgrid(矩阵 *行x, 矩阵 *行y, 矩阵 **坐标阵)
模仿numpy 的meshgrid
矩阵 * 点积(矩阵 &矩阵1)
矩阵点积运算,对应位置相乘再相加
int str2int(string ij)
字符串转整数
矩阵(矩阵python *结构体)
将python中的矩阵,转换为此矩阵
矩阵 * 单位化(void)
对矩阵的每一行,进行单位化
矩阵 * operator[](string ij)