矩阵的行序和列序存储

简介:

    在图形处理中,矩阵操作时最基本的操作,但是不同的系统中对矩阵的存储是不同,比如OpenGL和Cg中就是不一样的:

比如一个4x4矩阵[m11,m12,m13,m14

                           m21,m22,m23,m24

                           m31,m32,m33,m34

                           m41,m42,m43,m44],

在实现中通常将其存储为一个一维的线性数组如float matrix【16】或者float* matrix。

    在opengl中这个matrix中数据的顺序是先遍历列的,线性存储为{m11,m21,m31,m41,m12,m22,m32......},这被称为矩阵的列序(column-major)存储,我们使用GlGetfloatv(GL_MODELVIEW_MATRIX,...)等得到的存储矩阵的数组都是按照这样的顺序存储矩阵的。

    但是在cg中这个matrix的存储顺序确实先遍历行的,也就是存储为{m11,m12,m13,m14,m21,m22,m23,m24,m31,......},称为行序(row-major)存储,可能多数人认为这种存储顺序更“自然”,(其实我也这么觉得),这种存储方式也被称为是c-style的,好像是大多数系统里是按照行序存储矩阵的。

    不同的系统对矩阵的存储方式不一样,如果在程序中综合使用了不同的框架,就要注意进行统一了,比如你在opengl 中使用了CG脚本的时候,例如一个cg程序void programm(uniform float4x4 modelviewMatrix,... ...)要求你从程序中传入一个modelview矩阵,我们在程序中使用opengl的GlGetfloatv()函数得到了float* glmatrix 为这个modelview矩阵,但是这个glmatrix确不能直接赋给modelviewMatrix供cg使用,因为cg在解析这个glmatrix 会把它解析为行序的,我们可以在让modelviewMatrix得到glmatrix 后,调用transfor()将modelviewMatrix做一个转置,modelviewMatrix就变成cg所能正确解析的行序的了。

   行序和列序的转换其实就是一个矩阵的转置关系,虽然这个变换很简单,但是在使用不同的框架时,要记得先注意一下这个系统式采用哪种方式存储矩阵的,才不会犯错。

目录
相关文章
|
10月前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
6月前
|
存储 机器学习/深度学习 缓存
vLLM 核心技术 PagedAttention 原理详解
本文系统梳理了 vLLM 核心技术 PagedAttention 的设计理念与实现机制。文章从 KV Cache 在推理中的关键作用与内存管理挑战切入,介绍了 vLLM 在请求调度、分布式执行及 GPU kernel 优化等方面的核心改进。PagedAttention 通过分页机制与动态映射,有效提升了显存利用率,使 vLLM 在保持低延迟的同时显著提升了吞吐能力。
3188 19
vLLM 核心技术 PagedAttention 原理详解
|
运维 监控 网络协议
|
8月前
|
数据安全/隐私保护 UED 异构计算
【大模型私有化部署要花多少钱?】一张图看懂你的钱用在哪
本文探讨了高性价比实现DeepSeek大模型私有化部署的方法,分为两部分: 一是定义大模型性能指标,包括系统级(吞吐量、并发数)与用户体验级(首token生成时间、单token生成时间)指标,并通过roofline模型分析性能瓶颈; 二是评估私有化部署成本,对比不同硬件(如H20和4090)及模型选择,结合业务需求优化资源配置。适合关注数据安全与成本效益的企业参考。
【大模型私有化部署要花多少钱?】一张图看懂你的钱用在哪
|
8月前
|
JSON 运维 Ubuntu
在Docker上部署Ollama+AnythingLLM完成本地LLM Agent部署
通过以上步骤,您可以成功在Docker上部署Ollama和AnythingLLM,实现本地LLM Agent的功能。在部署过程中,确保环境和配置正确,以避免不必要的问题。希望本文能够帮助您顺利完成部署,并在本地环境中高效地使用LLM模型。
1995 8
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
669 7
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch 中的动态图与静态图:理解它们的区别及其应用场景
【8月更文第29天】深度学习框架中的计算图是构建和训练神经网络的基础。PyTorch 支持两种类型的计算图:动态图和静态图。本文旨在阐述这两种计算图的区别、各自的优缺点以及它们在不同场景下的应用。
3284 0
|
11月前
|
人工智能 测试技术 开发者
通义发布最强开源多模态推理模型QVQ!
通义发布最强开源多模态推理模型QVQ!
1513 19
|
11月前
|
应用服务中间件 nginx Docker
Docker:WARNING: Published ports are discarded when using host network mode 解决方法
Docker在使用 `host`网络模式时会忽略端口映射,因为此模式下容器已经直接暴露在主机网络上。通过理解并合理选择网络模式,可以有效解决 `WARNING: Published ports are discarded when using host network mode`的警告。根据具体需求,选择适合的网络模式,以便在保证性能的同时确保灵活性和安全性。希望本文提供的方法和分析能帮助您在使用Docker时更好地处理网络配置问题。
2156 12
|
C++
QML语法之property属性
QML语法之property属性
620 3