📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 48(1)

📅  最后修改于: 2023-12-03 15:37:15.096000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2014 | 问题 48

这是一道关于矩阵的编程题目。题目内容如下:

给定一个 $m\times n$ 的矩阵,矩阵中的数字可能为正数、负数或0。你需要编写一个程序,实现以下功能:

  1. 将矩阵中每个数替换为该数所在行中除自身外的所有数的平均值。

  2. 返回矩阵中绝对值最小的数的数值(不包括0)。

如果绝对值最小的数有多个,则返回数值最小的那个。

以下是函数的签名及其说明:

def compute_avg(mat: List[List[float]]) -> float:
    """
    将每个元素都替换为该元素所在行中除自身外的元素的平均值。

    参数:
    mat -- 给定的矩阵,一个 m×n 的列表,其中每个元素都是浮点数。

    返回值:
    无。

    """
    pass


def find_minimum(mat: List[List[float]]) -> float:
    """
    返回矩阵中绝对值最小的数的数值。

    参数:
    mat -- 给定的矩阵,一个 m×n 的列表,其中每个元素都是浮点数。

    返回值:
    矩阵中绝对值最小的数的数值。

    """
    pass
解题思路
替换矩阵中的每个元素

对于这个问题,我们需要实现一个名为 compute_avg 的函数,该函数接受一个 m×n 的矩阵作为参数。对于矩阵中的每一个元素,我们需要将它替换为该元素所在行中除自身外的所有数的平均值。

要实现这个功能,我们需要分别对矩阵中的每一行进行操作。对于每一行,我们可以先计算出除该元素外的所有元素的和,再除以该行的元素个数减一(即除去自身)。最终,我们将得到一个新的矩阵,每个元素都是出现在该行中的其他元素的平均值。最后,我们将这个新矩阵赋值给原始矩阵即可。

以下是 compute_avg 函数的代码实现:

def compute_avg(mat):
    for i in range(len(mat)):
        row_sum = sum(mat[i]) - mat[i][i]
        row_avg = row_sum / (len(mat[i]) - 1)
        for j in range(len(mat[i])):
            if j != i: # 不包括该元素本身
                mat[i][j] = row_avg
查找矩阵中的绝对值最小的数

对于这个问题,我们需要实现一个名为 find_minimum 的函数,该函数接受一个 m×n 的矩阵作为参数。找到矩阵中绝对值最小的数的数值并返回。

要实现这个功能,我们需要遍历整个矩阵,记录下绝对值最小的数及其值。如果找到了绝对值比已记录的最小值更小的数,我们就将最小值更新为该数的绝对值。

以下是 find_minimum 函数的代码实现:

def find_minimum(mat):
    min_abs_val = float('inf')
    for i in range(len(mat)):
        for j in range(len(mat[i])):
            # 如果该元素不为0,且其绝对值小于已记录的最小值,则更新最小值及其绝对值。
            if abs(mat[i][j]) < min_abs_val and mat[i][j] != 0:
                min_abs_val = abs(mat[i][j])
                min_val = mat[i][j]
    return min_val
总结

本题涉及到了矩阵的操作,包括遍历矩阵、修改矩阵元素、计算矩阵中每一行的平均值等。需要细心地考虑矩阵元素的下标和范围,以免遗漏某些元素或越界。

以下是实现了以上功能的完整代码:

from typing import List


def compute_avg(mat: List[List[float]]) -> float:
    """
    将每个元素都替换为该元素所在行中除自身外的元素的平均值。

    参数:
    mat -- 给定的矩阵,一个 m×n 的列表,其中每个元素都是浮点数。

    返回值:
    无。
    """
    for i in range(len(mat)):
        row_sum = sum(mat[i]) - mat[i][i]
        row_avg = row_sum / (len(mat[i]) - 1)
        for j in range(len(mat[i])):
            if j != i: # 不包括该元素本身
                mat[i][j] = row_avg


def find_minimum(mat: List[List[float]]) -> float:
    """
    返回矩阵中绝对值最小的数的数值。

    参数:
    mat -- 给定的矩阵,一个 m×n 的列表,其中每个元素都是浮点数。

    返回值:
    矩阵中绝对值最小的数的数值。
    """
    min_abs_val = float('inf')
    for i in range(len(mat)):
        for j in range(len(mat[i])):
            # 如果该元素不为0,且其绝对值小于已记录的最小值,则更新最小值及其绝对值。
            if abs(mat[i][j]) < min_abs_val and mat[i][j] != 0:
                min_abs_val = abs(mat[i][j])
                min_val = mat[i][j]
    return min_val