6 矩阵相关案例

矩阵计算在CUDA中的应用是并行计算领域的典型场景 ;

矩阵算法题通常涉及线性代数的基础知识,以及对数据结构和算法的深入理解。解决这类问题时,掌握一些核心思想和技巧会非常有帮助。以下是一些常见的矩阵算法题解题思想:

  1. 动态规划:矩阵链乘法问题是一个典型的例子,它要求找出最优的括号化方式来最小化乘法次数。动态规划通过构建一个表来存储子问题的解,从而避免重复计算,达到高效求解的目的。

  2. 分治策略:在处理大规模矩阵运算时,如大矩阵乘法,可以考虑分治法,即将大矩阵分割成小矩阵,先计算小矩阵的乘积,再合并结果。Strassen算法就是一个经典的分治算法,它将矩阵分为四个子矩阵,通过7次较小矩阵的乘法来计算原矩阵的乘积,而非传统的8次。

  3. 空间换时间:预计算和缓存技术可以用来加速某些类型的矩阵操作,例如计算矩阵的幂。通过预先计算并存储中间结果,后续计算可以复用这些结果,减少重复计算,尽管这可能会增加内存消耗。

  4. 位运算:在处理特殊类型的矩阵(如稀疏矩阵或二进制矩阵)时,位运算可以极大地提高效率。例如,利用位运算进行集合运算(交、并、差)可以比传统循环更快。

  5. 迭代与递归:在解决某些矩阵问题时,如计算矩阵的特征值、行列式或幂,迭代法和递归法可以提供不同的解决方案。迭代通常用于连续逼近问题,而递归则常用于分解问题为更小规模的相似问题。

  6. 利用矩阵特性:理解和利用矩阵的性质(如对称性、正定性、稀疏性)可以简化算法设计。例如,对称矩阵的乘法可以优化存储和计算,稀疏矩阵则可以通过压缩存储格式来节省空间和计算资源。

  7. 线性代数变换:诸如LU分解、QR分解、奇异值分解(SVD)等线性代数中的矩阵分解技术,可以将复杂问题转化为更易于处理的形式。这些方法在解决逆矩阵、最小二乘问题、特征值问题等方面非常有效。

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

思想:

既然要对矩阵中为零的元素的同行、同列都要置为0;

简单的:记住元素0 的行以及列;

在Python中,列表(list)的拷贝可以通过两种主要方式实现:浅拷贝(shallow copy)和深拷贝(deep copy)。这两种拷贝方式的主要区别在于它们处理列表中嵌套对象(如子列表或其他可变对象)的方式。

浅拷贝:里面有复杂结构的不会被拷贝;

浅拷贝创建了一个新列表,但这个新列表中的元素仍然是原列表中元素的引用。这意味着,如果原列表中含有其他可变对象(如子列表),新列表中的对应元素会指向相同的子列表对象。因此,修改新列表中的子列表会影响到原列表中的相应子列表。

浅拷贝可以通过以下方法实现:

  • 使用列表的 copy() 方法:new_list = original_list.copy()
  • 使用切片操作:new_list = original_list[:]

深拷贝:里面有复杂结构的也会被拷贝;

深拷贝则不仅创建列表的新副本,还会递归地拷贝列表中所有层级的元素,为所有嵌套的对象创建新的独立副本。因此,修改深拷贝得到的新列表中的任何元素,都不会影响到原列表或其嵌套对象。

深拷贝可以通过以下方法实现:

  • 使用 copy 模块的 deepcopy() 函数:import copy; new_list = copy.deepcopy(original_list)
import copy
class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        rows = []
        cols = []
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j] == 0:
                    rows.append(i) 
                    cols.append(j)
        
        for row,col in zip(rows,cols):
            matrix[row] = [0] * len(matrix[0])
            for z in range(len(matrix)):
                matrix[z][col] = 0

        

54. 螺旋矩阵

这个题目我遇到很多次了,真的是让我又爱又恨呢,孽缘啊!值的多看看几遍的题目;

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

思想:

到底怎么走的呢:

根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出 [1,2,3,6,9,8,7,4,5] 可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。

因此,考虑设定矩阵的 “左、上、右、下” 四个边界,模拟以上矩阵遍历顺序。

算法流程:
1 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
2 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
3 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。

  1. 根据边界打印,即将元素按顺序添加至列表 res 尾部。
  2. 边界向内收缩 1 (代表已被打印)。
  3. 判断边界是否相遇(是否打印完毕),若打印完毕则跳出。

4 返回值: 返回 res 即可。

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:return []
        l,r,t,b,res = 0,len(matrix[0])-1,0,len(matrix)-1,[]

        while True:
            for i in range(l,r+1): res.append(matrix[t][i])
            t+=1
            if t>b:break

            for i in range(t,b+1): res.append(matrix[i][r])
            r-=1
            if l>r:break

            for i in range(r,l-1,-1): res.append(matrix[b][i])
            b-=1
            if t>b:break

            for i in range(b,t-1,-1): res.append(matrix[i][l])
            l+=1
            if l>r:break
        return res

48. 旋转图像

MD! 这个题目,让我想到了在做计算机视觉时图像赠强!

给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

先转置,然后把每一列翻转;

这个想法,我最想到的就是把矩阵转置了;然后看了一下,知道了答案是什么!

 zip(*matrix) = 矩阵的列转置;

        在Python中,zip(*matrix) 是一种常用的操作,尤其在处理多维数组(如矩阵)时。这里的 matrix 假定是一个二维列表(即列表的列表),用于表示一个矩阵。星号(*)在函数调用中的作用是 unpacking(解包),它将矩阵的每一行作为单独的参数传递给 zip 函数。

    zip 函数的基本功能是将多个可迭代对象(在这个上下文中是矩阵的行)对应位置的元素配对,形成一个元组的迭代器。当应用于二维列表(矩阵)时,zip(*matrix) 的效果是将矩阵的列转置。也就是说,它会把矩阵的每一列元素收集起来,形成新的元组,这些元组组成的迭代器实质上代表了原矩阵的转置。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        for i in range(len(matrix)):
            for j in range(i, len(matrix[0])):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

        for i in range(len(matrix)):
            matrix[i] = matrix[i][::-1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32——定时器级联

在STM32当中扩展定时范围:单个定时器的定时长度可能无法满足某些应用的需求。通过级联,可以实现更长时间的定时;提高定时精度:能够在长定时的基础上,通过合理配置,实现更精细的定时控制;处理复杂…

Postman工具基本使用

一、安装及基本使用 安装及基本使用参见外网文档:全网最全的 postman 工具使用教程_postman使用-CSDN博客 建议版本:11以下,比如10.x.x版本。11版本以后貌似是必须登录使用 二、禁止更新 彻底禁止postman更新 - 简书 host增加&#xff1…

vector与list的简单介绍

1. 标准库中的vector类的介绍: vector是表示大小可以变化的数组的序列容器。 就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数…

【计算机毕业设计】026基于微信小程序的原创音乐

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后,在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

《昇思25天学习打卡营第9天|保存与加载》

文章目录 今日所学:一、构建与准备二、保存和加载模型权重三、保存和加载MindIR总结 今日所学: 在上一章节主要学习了如何调整超参数以进行网络模型训练。在这一过程中,我们通常会想要保存一些中间或最终的结果,以便进行后续的模…

《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!

在当今充满数字化娱乐和信息快速变迁的时代,如何创新引导孩子们学习,特别是如何培养他们的写作能力,一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》,该系列动画通过其独特的故事情节和…

Elasticsearch 使用误区之二——频繁更新文档

在使用 Elasticsearch 时,频繁更新文档是一种常见误区。这不仅影响性能,还可能导致系统资源的浪费。 理解 Elasticsearch 的文档更新机制对于优化性能至关重要。 关于 Elasticsearch 更新操作,常见问题如下: ——https://t.zsxq.c…

word 转pdf 中图片不被压缩的方法

word 转pdf 中图片不被压缩的方法 法1: 调节word 选项中的图片格式为不压缩、高保真 法2: 1: word 中的图片尽可能使用高的分辨率,图片存为pnd或者 tif 格式(最高清) 2: 转化为pdf使用打印机器,参数如下…

Java面试题-锁

整体关于锁知识总结 下面是放大版: 补充:锁的粒度 忘记说了全局锁 : 1, 全局锁 flush tables with read lock ; // 对整个数据库上锁; 2, unlock tables; // 释放锁 但是我们一般不用;只有在数…

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录 1&#xff0c;原生 Switch 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Switch 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; function News() {return <div className"p…

【Linux进阶】文件和目录的默认权限与隐藏权限

1.文件默认权限&#xff1a;umask OK&#xff0c;那么现在我们知道如何建立或是改变一个目录或文件的属性了&#xff0c;不过&#xff0c;你知道当你建立一个新的文件或目录时&#xff0c;它的默认权限会是什么吗&#xff1f; 呵呵&#xff0c;那就与umask这个玩意儿有关了&…

MFC+MySQL应用:配置

MFCMySQL 1. MFC UI界面生成2. 数据库和表生成创建数据库创建表添加表数据 3. VS中配置MySQL环境 1. MFC UI界面生成 链接: MFC使用方法 可以根据用户自身需求生成单文档、对话框等不同样式的UI界面。 2. 数据库和表生成 可以在workbench或者MySQL Server中创建数据库和表。…

SSM学生资助管理系统-计算机毕业设计源码30825

目 录 摘 要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 学生资助管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

传统数据处理系统存在的问题

传统应用的数据系统架构设计时&#xff0c;应用直接访问数据库系统。当用户访问量增加时&#xff0c;数据库无法支撑日益增长的用户请求的负载&#xff0c;从而导致数据库服务器无法及时响应用户请求&#xff0c;出现超时的错误。 出现这种情况以后&#xff0c;在系统架构上就采…

【Ubuntu24.04无显示器远控】【Todesk远程桌面黑屏】【Linux虚拟显示器】解决方案

1️⃣版本 Ubuntu 24.04Todesk 4.7.2.0xserver-xorg-video-dummy 1:0.4.0-1build1 2️⃣安装配置虚拟显示器 sudo apt install xserver-xorg-video-dummy编辑/etc/gdm3/custom.conf&#xff0c;关闭Ubuntu24.04Wayland切换为X11 WaylandEnablefalse /usr/share/X11/xorg.con…

1-认识网络爬虫

1.什么是网络爬虫 ​ 网络爬虫&#xff08;Web Crawler&#xff09;又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定规则&#xff0c;自动浏览万维网的程序或脚本。通俗地讲&#xff0c;网络爬虫就是一个模拟真人浏览万维网行为的程序&#xff0c;这个程序可以代替真人…

PyPDF2合并PDF文件的高级应用:指定合并方式

本文目录 前言一、合并PDF的高级应用1、逻辑讲解2、合并效果图3、完整代码二、异常校验1、合并过程中的错误校验前言 本文我们主要来讲解一下PyPDF2合并PDF文件的高级应用,就是指定合并方式进行合并,构建函数支持模式选择,主要不管咋折腾,其实就是不想去付费买那个PDF编辑…

CS算法(二)—— 斜视SAR点目标仿真

SAR成像专栏目录 我们按照Cumming教授所著的《合成孔径雷达成像——算法与实现》7.6节的点目标参数进行仿真,斜视角设置为8,中心斜距改为1000km。先放最终的仿真结果: 1. 参数配置 在中心点和中心的的上下左右方向设置5个点目标 : function para=config_sar_para_cumming(…

技术市集 | 如何通过WSL 2在Windows上挂载Linux磁盘?

你是否常常苦恼&#xff0c;为了传输或者共享不同系统的文件需要频繁地在 Windows 和 Linux 系统之间切换&#xff0c;既耽误工作效率&#xff0c;也容易出错。 那么有没有一种办法&#xff0c;能够让你在Windows系统中像访问本地硬盘一样来操作Linux系统中的文件呢&#xff1…