鱼C论坛

 找回密码
 立即注册
查看: 2599|回复: 5

[技术交流] Python:每日一题 114

[复制链接]
发表于 2017-10-17 13:34:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

如果大家都有跟着@小甲鱼老师的视频好好学习python的话,自己编写数学计算器这种小程序应该都能没有问题了,接下来的几个小练习中,我将一步一步引导大家,如何编写一个矩阵计算器,像这个样子,很激动吧?

                               
登录/注册后可看大图

在上一期中我们设计了矩阵除法,链接地址:http://bbs.fishc.com/thread-97920-1-3.html。这期我们继续来设计求矩阵的模

题目:矩阵的模
矩阵的模的基础知识:

                               
登录/注册后可看大图

例如:

                               
登录/注册后可看大图


现在给定一个M x M的矩阵(2<=M<=5),请设计程序,输出计算结果。

  1. def matrix_calc(list):
  2.     'Your code here'
  3.     return result
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-17 16:09:10 | 显示全部楼层
python 传递列表到函数的时候,传递的是地址而不是值,这个怎么解决呢
为了这个问题,专门又在本来复制了两遍这个列表

从数组的第二行开始进行循环移位,这样就可以使用 [e1 * e2 for (e1,e2) in zip(i,list1)]这种形式进行元素相乘了。
把数组逆序过来,正好是反对角线的矩阵



  1. def matrix_calc_det(list1):
  2.     matrix1=[]
  3.     matrix1r=[]
  4.    
  5.     for i in list1:
  6.         m1=[]
  7.         m1r=[]
  8.         for j in i:
  9.             m1.append(j)
  10.             m1r.append(j)
  11.         matrix1.append(m1)
  12.         matrix1r.append(m1r)
  13.     matrix1r.reverse()

  14.     indexi=0
  15.    
  16.     for i in matrix1:
  17.         if (indexi==0):
  18.             list1=i
  19.             list1r=matrix1r[indexi]
  20.         else:
  21.             indexj=0
  22.             for j in range(indexi):
  23.                 i.append(i[0])
  24.                 del(i[0])
  25.                 matrix1r[indexi].append(matrix1r[indexi][0])
  26.                 del(matrix1r[indexi][0])
  27.                 indexj=indexj+1
  28.             list1 = [e1 * e2 for (e1,e2) in zip(i,list1)]
  29.             list1r= [e1 * e2 for (e1,e2) in zip(matrix1r[indexi],list1r)]
  30.         indexi=indexi+1

  31.     result_1=sum(list1)

  32.     result_2=sum(list1r)
  33.   
  34.     return (result_1-result_2)


复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
jerryxjr1220 + 3 + 3 + 3 答题奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 17:24:12 | 显示全部楼层
xindong 发表于 2017-10-17 16:09
python 传递列表到函数的时候,传递的是地址而不是值,这个怎么解决呢
为了这个问题,专门又在本来复制了 ...


其实还有一种方法也可以求:
  1. | a11  a12  a13 |
  2. | a21  a22  a23 | = a11 *  |  a22  a23 | + a12 *  |  a21  a23 | + a13 *  |  a21  a22 |
  3. | a31  a32  a33 |          |  a32  a33 |          |  a31  a33 |          |  a31  a32 |
复制代码


这样的话,其实就可以用递归来写,会简单很多。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 20:09:49 | 显示全部楼层
本帖最后由 solomonxian 于 2017-10-17 20:14 编辑

这看起来是行列式吧,“矩阵的模”这种说法貌似比较少见
行列式有n阶公式,是递归定义的,按行来展开
Det(A_nn) = (-1)**(1+1)*a_11*Det(A_11) + (-1)**(1+2)*a_12*Det(A_12)+...+(-1)**(1+n)*a_1n*Det(A_1n)

基本情况是2阶的时候,Det([[a,b],[c,d]]) = a*d - b*c

  1. def det(matrix):
  2.     assert {len(matrix) - len(i) for i in matrix} == {0} and len(matrix) > 1 # 方阵才有行列式
  3.    
  4.     def _det(matrix):
  5.         if len(matrix) == 2:
  6.             return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]
  7.         else:
  8.             return sum((-1)**i * j * _det([[b for a,b in enumerate(c) if a != i]
  9.                                           for c in matrix[1:]]) for i,j in enumerate(matrix[0]))
  10.     return _det(matrix)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 20:19:31 | 显示全部楼层
jerryxjr1220 发表于 2017-10-17 17:24
其实还有一种方法也可以求:

应该还有个(-1)**(i+j)的系数吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-4-30 13:41:40 | 显示全部楼层
刷题到现在,我发现我还是只会循环遍历,python的标准库不懂,好烦啊,但凡是计算量的,我都不会啊
def matrix_calc(A):
    M = len(A)
    if M == 1:
        return A[0]
    for i in range(M):
        print(A[i])
        A[i].extend(A[i])
    print(A)
    a = 0
    for i in range(M):
        a0 = 1
        for j in range(M):
            a0 *= A[0+j][i+j]
        a += a0
    print(a)
    b = 0
    for i in range(2*M - 1, M-1, -1):
        b0 = 1
        for j in range(M):
            b0 *= A[0+j][i-j]
        b += b0
        print(b0)
    print(b)
    return a - b
        
    #for
    pass
num1 = [[1,2,3],[1,2,4],[1,2,3]]
matrix_calc(num1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 06:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表