【Python】基于numpy求矩阵中扇形范围内最大值及其行列号

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Python 基于numpy求矩阵中扇形范围内最大值及其行列号

  • 前言
  • 计算函数
    • 代码


前言

在矩阵中给定扇形范围内,求最大矩阵值,及其在矩阵中的行列号
注:矩阵中先行号后列号,图形中先x(列表示)后y(行表示)

计算函数

输入椭圆圆心坐标、另外两个端点坐标、角平分线与曲线交点坐标(均为整数)及矩阵M
输出椭圆内最大值及其行列号

注:几何区域由两直线线段与一部分椭圆曲线构成,椭圆曲线部分的验证可改为其他曲线,

代码

求最值的代码如下(示例):

import numpy as np
def searchin3(po, pm, pn, pct, M):
    """
    求扇形内矩阵最大值,及最大值在M的xy值

    :param po: int 点O,椭圆心,包含两个数字(整数),第一个x值,第二个y值
    :param pm: int 点M,椭圆上一点,包含两个数字(整数),第一个x值,第二个y值
    :param pn: int 点N,椭圆上一点,包含两个数字(整数),第一个x值,第二个y值
    :param pct: int 中心点,区域内角平分线与椭圆的交点,包含两个数字(整数),第一个x值,第二个y值
    :param M:  ndarray 矩阵
    :return:   height:扇形内矩阵最大值; highest_point: 最大值在M的x值y值

    注: Dmaxcoord[0]-行号-y-ymax; Dmaxcoord[1]-列号-x-xmax
        扇形弧可能非取自圆形
    """

    rowmin = np.min(([po[1],pm[1],pn[1],pct[1]]))
    rowmax = np.max(([po[1],pm[1],pn[1],pct[1]]))
    colmin = np.min(([po[0],pm[0],pn[0],pct[0]]))
    colmax = np.max(([po[0],pm[0],pn[0],pct[0]]))
    x0=po[0]
    y0=po[1]
    D = M[rowmin:rowmax, colmin:colmax]
    vm = (pm[0]-po[0], pm[1]-po[1]) # 向量
    vn = (pn[0]-po[0], pn[1]-po[1])
    vct = (pct[0]-po[0], pct[1]-po[1])
    # 算椭圆
    if abs(pm[0] - pn[0]) > 0.001 and abs(pm[1] - pn[1]) > 0.001:
        a1 = (vn[0] ** 2) * (vm[1] ** 2) - (vm[0] ** 2) * (vn[1] ** 2)
        a2 = vm[1] ** 2 - vn[1] ** 2
        b2 = vn[0] ** 2 - vm[0] ** 2
        asquare = a1/a2 # ((pn[0] ** 2) * (pm[1] ** 2) - (pm[0] ** 2) * (pn[1] ** 2)) / (pm[1] ** 2 - pn[1] ** 2)
        bsquare = a1/b2 # ((pn[0] ** 2) * (pm[1] ** 2) - (pm[0] ** 2) * (pn[1] ** 2)) / (pn[0] ** 2 - pm[0] ** 2)
    else:
        a1 = (vct[0] ** 2) * (vm[1] ** 2) - (vm[0] ** 2) * (vct[1] ** 2)
        asquare = a1 / (vm[1] ** 2 - vct[1] ** 2)
        bsquare = a1 / (vct[0] ** 2 - vm[0] ** 2)
    ra = asquare**0.5
    rb = bsquare**0.5
    count1 = 0
    while True:
        Dmax = np.max(D)
        Dmaxcoord = np.where(D == np.max(D))
        #print(Dmaxcoord,np.size(Dmaxcoord[0]))
        itern = np.size(Dmaxcoord[0])
        if itern > 1:
            ymax = Dmaxcoord[0][0] + rowmin
            xmax = Dmaxcoord[1][0] + colmin

            veri1 = (vm[0] * vct[1] - vm[1] * vct[0]) * (vm[0] * (ymax - y0) - vm[1] * (xmax - x0))  # 算线om,需与pct在om的同一侧
            veri2 = (vn[0] * vct[1] - vn[1] * vct[0]) * (vn[0] * (ymax - y0) - vn[1] * (xmax - x0))  # 算线on
            veri3 = bsquare * ((xmax - x0) ** 2) + asquare * ((ymax - y0) ** 2) - asquare * bsquare  # 椭圆方程,需在内部

            if veri3 < 0 and veri1 > 0 and veri2 > 0:
                height = Dmax
                highest_point = (xmax + 1, ymax + 1)
                return height, highest_point
            else:
                Dx = Dmaxcoord[0][0]
                Dy = Dmaxcoord[1][0]
                D[Dx, Dy] = 10   #应为矩阵内最小值或比原矩阵最小值更小的值
                count1 = count1 + 1
        else:
            ymax = Dmaxcoord[0] + rowmin
            xmax = Dmaxcoord[1] + colmin

            veri1 = (vm[0] * vct[1] - vm[1] * vct[0]) * (vm[0] * (ymax - y0) - vm[1] * (xmax - x0))  # 算线om,需与pct在om的同一侧
            veri2 = (vn[0] * vct[1] - vn[1] * vct[0]) * (vn[0] * (ymax - y0) - vn[1] * (xmax - x0))  # 算线on
            veri3 = bsquare*((xmax-x0)**2)+asquare*((ymax-y0)**2)-asquare*bsquare # 椭圆方程,需在内部

            if veri3 < 0 and veri1 > 0 and veri2 > 0:
                height = Dmax
                highest_point = (xmax + 1, ymax + 1)
                return height, highest_point
            else:
                D[Dmaxcoord[0],Dmaxcoord[1]]=10
                print('错误结果 %f\n',xmax,ymax)
                count1 = count1+1
        if count1 >= ra*rb*4:
            height = Dmax
            highest_point = po
            return height, highest_point   

欢迎在评论区讨论或补充说明。

你可能感兴趣的:(python,numpy,矩阵)