awk替代matlab/excel之一,简单的矩阵计算

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
x007007007
帖子: 406
注册时间: 2007-11-07 17:53
系统: Mac
来自: shanghai
联系:

awk替代matlab/excel之一,简单的矩阵计算

#1

帖子 x007007007 » 2010-08-29 2:05

以下内容仅供娱乐....其次声明,完全作到标题所说的,基本和难,其次没必要;仅供学习参考 :em04
程序说明:
函数init_matrix,用于读取文件中的数据,产生一个二维数组,其中
maname[0,0]~maname[0,j]保存此数组行数
maname[i,0]保存第i行的元素数
maname[i,j]保存矩阵a_{i,j}的元素
x1,y1是开始读取的坐标,x2,y2是读取结束的坐标
函数print_matrix_e,打印矩阵,e代表仅用于END{}之中
函数sum_matrix_e(matrix,matrixA,matrixB)
矩阵matrixA+矩阵matrixB=矩阵matrix

代码: 全选

#!/usr/bin/awk -f

function init_matrix(maname,x1,y1,x2,y2,other,_ARGVEND_,i,j)
{
	
	if( y2>=NR && NR>=y1 )
	{
		i=NR-y1+1
	#	print "NR:",NR,"Y:",y1,"i:",i
		for(j=1;j<=x2-x1+1;j++)
		{
		#	print "j:",j
			maname[i,j]=$j
			maname[i,0]=j		#行号
			maname[0,j]=i		#列
			maname[0,0]=i
			if(other ~/show/)
			printf("%d\t",maname[i,j])
		}
			if(other ~/show/)
			printf("\n")
	}
}
function print_matrix_e(print_matrix_e_matrix,_ARGVEND_,i,j)
{
	for(i=1;i<=print_matrix_e_matrix[0,0];i++)
	{
		for(j=1;j<=print_matrix_e_matrix[i,0];j++)
		{
			printf("%s\t",print_matrix_e_matrix[i,j])
		}
		printf("\n")
	}
}

function sum_matrix_e(matrix,matrixA,matrixB,other,_ARGVEND_,i,j)
{
#print  matrixA[0,0],matrixB[0,0]
	if(matrixA[0,0]==matrixB[0,0])
	{matrix[0,0]=matrixA[0,0]
		for(i=1;i<=matrixA[0,0];i++)
		{
			# print matrixA[i,1]
			for(j=1;j<=matrixA[i,0];j++)
			{
				if(matrixA[i,0]==matrixB[i,0]){
				matrix[i,0]=matrixA[i,0]
				matrix[0,j]=matrixA[0,j]
				matrix[i,j]=matrixA[i,j]+matrixB[i,j]

				if(other ~/show/)print i,j,"=",matrix[i,j]
				}
				else{
				print matrixA[i,0],matrixB[i,0]
				error_no=-1
				error_no[0]=i
				return error_no
				}
			}
		}
	}else retuen -2
return 0
}

BEGIN{
FS="	"

}
{
init_matrix(matrix1,1,1,10,10)

init_matrix(matrix2,1,13,10,22)
}

END{
print "矩阵A======================"
print_matrix_e(matrix1)
print "矩阵B======================"
print_matrix_e(matrix2)
sum_matrix_e(mat,matrix1,matrix2)
print "矩阵A+矩阵B======================"
print_matrix_e(mat)
}
测试数据:

代码: 全选

92	99	 1	 8	15	67	74	51	58	40
98	80	 7	14	16	73	55	57	64	41
4	81	88	20	22	54	56	63	70	47
85	87	19	21	 3	60	62	69	71	28
86	93	25	 2	 9	61	68	75	52	34
17	24	76	83	90	42	49	26	33	65
23	 5	82	89	91	48	30	32	39	66
79	 6	13	95	97	29	31	38	45	72
10	12	94	96	78	35	37	44	46	53
11	18	100	77	84	36	43	50	 1	59


92	99	 1	 8	15	67	74	51	58	0
98	80	 7	14	16	73	55	57	64	41
4	81	88	20	22	54	56	63	70	47
85	87	19	21	 3	60	62	69	71	28
86	93	25	 2	 9	61	68	75	52	34
17	24	76	83	90	42	49	26	33	65
23	 5	82	89	91	48	30	32	39	66
79	 6	13	95	97	29	31	38	45	72
10	12	94	96	78	35	37	44	46	53
79	 6	13	95	97	29	31	38	45	72
输出结果:

代码: 全选

矩阵A======================
92	99	 1	 8	15	67	74	51	58	40	
98	80	 7	14	16	73	55	57	64	41	
4	81	88	20	22	54	56	63	70	47	
85	87	19	21	 3	60	62	69	71	28	
86	93	25	 2	 9	61	68	75	52	34	
17	24	76	83	90	42	49	26	33	65	
23	 5	82	89	91	48	30	32	39	66	
79	 6	13	95	97	29	31	38	45	72	
10	12	94	96	78	35	37	44	46	53	
11	18	100	77	84	36	43	50	 1	59	
矩阵B======================
92	99	 1	 8	15	67	74	51	58	0	
98	80	 7	14	16	73	55	57	64	41	
4	81	88	20	22	54	56	63	70	47	
85	87	19	21	 3	60	62	69	71	28	
86	93	25	 2	 9	61	68	75	52	34	
17	24	76	83	90	42	49	26	33	65	
23	 5	82	89	91	48	30	32	39	66	
79	 6	13	95	97	29	31	38	45	72	
10	12	94	96	78	35	37	44	46	53	
79	 6	13	95	97	29	31	38	45	72	
矩阵A+矩阵B======================
184	198	2	16	30	134	148	102	116	40	
196	160	14	28	32	146	110	114	128	82	
8	162	176	40	44	108	112	126	140	94	
170	174	38	42	6	120	124	138	142	56	
172	186	50	4	18	122	136	150	104	68	
34	48	152	166	180	84	98	52	66	130	
46	10	164	178	182	96	60	64	78	132	
158	12	26	190	194	58	62	76	90	144	
20	24	188	192	156	70	74	88	92	106	
90	24	113	172	181	65	74	88	46	131	
:em11
人生来只做的两件事:
1.犯错
2.改错
只犯错不改错的是魔鬼,只改错不犯错的是上帝
总之,都不是人!!!!!!!!!!!!!
我的地盘
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: awk替代matlab/excel之一,简单的矩阵计算

#2

帖子 eexpress » 2010-08-29 17:15

某些实现了 hash 的语言(如早期的 awk 语言,Larry 从中借鉴了 hash)
,当 hashes 变大时,速度会变慢。Perl 中不会有这种
问题,因为它有一个优秀的算法◆。因此,如果 Perl 只有 3 个 key/value 对,它的速度很快。当拥有 3 百万 key/value 对时,
其速度仍非常快。大的 hash 表,对性能不会有什么影响。
● 鸣学
头像
x007007007
帖子: 406
注册时间: 2007-11-07 17:53
系统: Mac
来自: shanghai
联系:

Re: awk替代matlab/excel之一,简单的矩阵计算

#3

帖子 x007007007 » 2010-08-29 19:36

eexpress 写了:
某些实现了 hash 的语言(如早期的 awk 语言,Larry 从中借鉴了 hash)
,当 hashes 变大时,速度会变慢。Perl 中不会有这种
问题,因为它有一个优秀的算法◆。因此,如果 Perl 只有 3 个 key/value 对,它的速度很快。当拥有 3 百万 key/value 对时,
其速度仍非常快。大的 hash 表,对性能不会有什么影响。
据说awk可以用于天文学计算的,,效率因该不比perl差...百万级数据没地方比较....不过根据一些网上的资料.awk貌似比Perl快许多的..
参见:http://dbablog.journalspace.com/?p=233
根据此处给出的数据可见的同样数据awk用时不到Perl的三分之一 :em11
人生来只做的两件事:
1.犯错
2.改错
只犯错不改错的是魔鬼,只改错不犯错的是上帝
总之,都不是人!!!!!!!!!!!!!
我的地盘
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: awk替代matlab/excel之一,简单的矩阵计算

#4

帖子 eexpress » 2010-09-07 13:14

看了。那语法都不完整的。不知道你的$F[3]从何来的。lol
再说,pl何时会去傻到先分解成数组,在去正则。那是及其低下的操作。
:em04
先模拟下awk的操作习惯,再去比较?



http://dbablog.journalspace.com/?p=233 里面的F[3]啊。那可不是完整的可证实的例子。。 道听途说的网页文章。
● 鸣学
头像
x007007007
帖子: 406
注册时间: 2007-11-07 17:53
系统: Mac
来自: shanghai
联系:

Re: awk替代matlab/excel之一,简单的矩阵计算

#5

帖子 x007007007 » 2010-09-07 17:31

:em03 $F[3] 在哪?我怎么没看到。。。
ee你的pl怎么实现的? :em06
人生来只做的两件事:
1.犯错
2.改错
只犯错不改错的是魔鬼,只改错不犯错的是上帝
总之,都不是人!!!!!!!!!!!!!
我的地盘
回复