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

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

  • 前言
  • 计算函数
    • 代码


前言

在矩阵中给定椭圆环范围内,求最大矩阵值,及其在矩阵中的行列号
注1:图形为同心椭圆环,且长短半轴分别与xy轴平行
注2:矩阵中先行号后列号,图形中先x(列表示)后y(行表示)
注3:与前文求椭圆范围内最大值逻辑基本相似,区别主要在判断语句上,输入输出改得有点乱,本篇不适用于学习

计算函数

输入xy轴方向各取最大最小的八个点坐标(每个椭圆各两个,其中计算使用椭圆长短半轴及中心点坐标(均为整数))及矩阵M
输出椭圆环内最大值及其列号与行号

代码

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

import numpy as np
def searchin2(pa1, pb1, pc1, pd1, pa2, pb2, pc2, pd2, M):
    """
    求椭圆环内矩阵最大值,及最大值在M的xy值

    :param pa1: int 点A1,包含两个数字(整数),第一个x值,第二个y值
    :param pb1: int 点B1,包含两个数字(整数),第一个x值,第二个y值
    :param pc1: int 点C1,包含两个数字(整数),第一个x值,第二个y值
    :param pd1: int 点D1,包含两个数字(整数),第一个x值,第二个y值
    :param pa2: int 点A2,包含两个数字(整数),第一个x值,第二个y值
    :param pb2: int 点B2,包含两个数字(整数),第一个x值,第二个y值
    :param pc2: int 点C2,包含两个数字(整数),第一个x值,第二个y值
    :param pd2: int 点D2,包含两个数字(整数),第一个x值,第二个y值
    :param M:  ndarray 矩阵
    :return:   height:椭圆内矩阵最大值; highest_point: 椭圆内矩阵最大值在M的x值y值
    几何关系:点A1 B1 C1 D1组成内椭圆;点A2 B2 C2 D2组成外椭圆; 且为同心椭圆
    注: x跟a, y跟b,椭圆方程
        b^2*x^2+a^2*y^2=a^2*b^2
        Dmaxcoord[0]-行号-y-ymax; Dmaxcoord[1]-列号-x-xmax
    """

    ra1 = int((pa1[0] - pc1[0])/2)
    rb1 = int((pb1[1] - pd1[1])/2)
    x0 = int(pa1[0] -ra1)
    y0 = int(pa1[1])
    ra2 = int((pa2[0] - pc2[0]) / 2)
    rb2 = int((pb2[1] - pd2[1]) / 2)
    D = M[y0-rb2:y0+rb2, x0-ra2:x0+ra2]
    while 1:
        Dmax = np.max(D)
        Dmaxcoord = np.where(D == np.max(D))
        #print(Dmaxcoord,np.size(Dmaxcoord[0]))
        itern = np.size(Dmaxcoord[0])
        height = 0
        if itern > 1:
            for i in range(itern):
                ymax = Dmaxcoord[0][i] + y0 - rb2 - 1
                xmax = Dmaxcoord[1][i] + x0 - ra2 - 1
                veri1 = (xmax-x0)**2 * rb1**2 + (ymax-y0)**2 * ra1**2 - ra1**2 * rb1**2
                veri2 = (xmax - x0) ** 2 * rb2 ** 2 + (ymax - y0) ** 2 * ra2 ** 2 - ra2 ** 2 * rb2 ** 2
                if veri2 < 0 and veri1 >= 0:
                    height = Dmax
                    break
                else:
                    D[Dmaxcoord[0][i],Dmaxcoord[1][i]]=0
        else:
            ymax = Dmaxcoord[0] + y0 - rb2 - 1
            xmax = Dmaxcoord[1] + x0 - ra2 - 1
            veri1 = (xmax - x0) ** 2 * rb1 ** 2 + (ymax - y0) ** 2 * ra1 ** 2 - ra1 ** 2 * rb1 ** 2
            veri2 = (xmax - x0) ** 2 * rb2 ** 2 + (ymax - y0) ** 2 * ra2 ** 2 - ra2 ** 2 * rb2 ** 2
            if veri2 <= 0 and veri1 > 0:
                height = Dmax
                break
            else:
                D[Dmaxcoord[0], Dmaxcoord[1]] = 0
        if height != 0:
            break

    highest_point = (xmax+1, ymax+1)

    return height, highest_point


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

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