matlab中矩阵重排列,稀疏矩阵重新排序 - MATLAB Simulink Example - MathWorks 中国
可视化稀疏矩阵
spy 图可以显示矩阵中的非零元素。
下面的 spy 图显示了从杠铃矩阵的一部分得到的稀疏对称正定矩阵。此矩阵描述类似杠铃的图中的连接。
load barbellgraph.mat
S = A + speye(size(A));
pct = 100 / numel(A);
spy(S)
title('A Sparse Symmetric Matrix')
nz = nnz(S);
xlabel(sprintf('Nonzeros = %d (%.3f%%)',nz,nz*pct));
以下是杠铃图。
G = graph(S,'omitselfloops');
p = plot(G,'XData',xy(:,1),'YData',xy(:,2),'Marker','.');
axis equal
计算 Cholesky 因子
计算 Cholesky 因子 L,其中 S = L*L'。请注意,L 比未分解的 S 包含更多的非零元素,因为计算 Cholesky 分解产生了填充非零值。这些填充值会降低算法速度并增加存储成本。
L = chol(S,'lower');
spy(L)
title('Cholesky Decomposition of S')
nc(1) = nnz(L);
xlabel(sprintf('Nonzeros = %d (%.2f%%)',nc(1),nc(1)*pct));
重新排序以加快计算速度
通过对矩阵的各行和各列重新排序,有可能减少由于分解而产生的填充值数量,从而降低后续计算的时间和存储成本。
MATLAB® 支持若干种不同的重新排序方法:
colperm:列计数
symrcm:反向 Cuthill-McKee 排序
amd:最小度
dissect:嵌套剖分
测试这些稀疏矩阵重新排序方法对杠铃矩阵的影响。
列计数重新排序
colperm 命令使用列计数重新排序算法将非零计数较大的行和列移向矩阵的末尾。
q = colperm(S);
spy(S(q,q))
title('S(q,q) After Column Count Ordering')
nz = nnz(S);
xlabel(sprintf('Nonzeros = %d (%.3f%%)',nz,nz*pct));
对于此矩阵,列计数排序几乎无法减少 Cholesky 分解的时间和存储量。
L = chol(S(q,q),'lower');
spy(L)
title('chol(S(q,q)) After Column Count Ordering')
nc(2) = nnz(L);
xlabel(sprintf('Nonzeros = %d (%.2f%%)',nc(2),nc(2)*pct));
反向 Cuthill-McKee 重新排序
symrcm 命令使用反向 Cuthill-McKee 重新排序算法将所有非零元素移至更靠近对角线的位置,从而减小原始矩阵的带宽。
d = symrcm(S);
spy(S(d,d))
title('S(d,d) After Cuthill-McKee Ordering')
nz = nnz(S);
xlabel(sprintf('Nonzeros = %d (%.3f%%)',nz,nz*pct));
Cholesky 分解产生的填充值被限制在该带宽内,因此分解重新排序后的矩阵需要的时间和存储空间较少。
L = chol(S(d,d),'lower');
spy(L)
title('chol(S(d,d)) After Cuthill-McKee Ordering')
nc(3) = nnz(L);
xlabel(sprintf('Nonzeros = %d (%.2f%%)', nc(3),nc(3)*pct));
最小度重新排序
amd 命令使用一种近似最小度算法(一种非常有用的图论技巧)在矩阵中产生大块的零。
r = amd(S);
spy(S(r,r))
title('S(r,r) After Minimum Degree Ordering')
nz = nnz(S);
xlabel(sprintf('Nonzeros = %d (%.3f%%)',nz,nz*pct));
Cholesky 分解会保留最小度算法产生的各块零。此结构可以显著降低时间和存储成本。
L = chol(S(r,r),'lower');
spy(L)
title('chol(S(r,r)) After Minimum Degree Ordering')
nc(4) = nnz(L);
xlabel(sprintf('Nonzeros = %d (%.2f%%)',nc(4),nc(4)*pct));
嵌套剖分置换
dissect 函数使用图论方法来生成减少填充的排序。该算法将矩阵视为图的邻接矩阵,通过折叠顶点和边来粗化图,重排较小的图,然后通过细化步骤对小图去粗,得到重排的原始图。结果将得到一个功能强大的算法,与其他重新排序算法相比,它往往产生最少的填充量。
p = dissect(S);
spy(S(p,p))
title('S(p,p) After Nested Dissection Ordering')
nz = nnz(S);
xlabel(sprintf('Nonzeros = %d (%.3f%%)',nz,nz*pct));
与最小度排序相似,嵌套剖分排序的 Cholesky 分解最大程度地保留主对角线下方的 S(d,d) 非零结构体。
L = chol(S(p,p),'lower');
spy(L)
title('chol(S(p,p)) After Nested Dissection Ordering')
nc(5) = nnz(L);
xlabel(sprintf('Nonzeros = %d (%.2f%%)',nc(5),nc(5)*pct));
汇总结果
下面的条形图总结了执行 Cholesky 分解之前对矩阵重新排序所带来的影响。虽然原始矩阵的 Cholesky 分解约有 8% 的元素非零,但使用 dissect 或 symamd 可将该密度降至低于 1%。
labels = {'Original','Column Count','Cuthill-McKee',...
'Min Degree','Nested Dissection'};
bar(nc*pct)
title('Nonzeros After Cholesky Factorization')
ylabel('Percent');
ax = gca;
ax.XTickLabel = labels;
ax.XTickLabelRotation = -45;
matlab中矩阵重排列,稀疏矩阵重新排序 - MATLAB Simulink Example - MathWorks 中国相关推荐
- matlab中矩阵的logical函数,Matlab中的logical
Matlab中什么是logical logical作为逻辑变量,可以是一种数据类型,第一次见到是在workspace里100*1logical,可以用在取出最值. logical是布尔变量,可以是一个 ...
- matlab中矩阵的表示与简单操作
matlab中矩阵的表示与简单操作 原文地址为:matlab矩阵的表示和简单操作 一.矩阵的表示 在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在"[ ]"内: b.矩阵的 ...
- Matlab中矩阵编号方式以及一维二维三维数据间的相互转换
Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 文章目录 Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 一.问题的提出 二.一维数据转为二维和三维 三.三维数据转为一维和二维 ...
- 在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数
在做研究的时候我们经常需要对模型的参数就行相应的选择,然而有没有觉得每次更改一个参数都需要运行一次仿真程序觉得很无聊呀,运行完程序还要看效果怎么样,然后再根据效果来调整参数,再次运行程序,如此反复. ...
- matlab矩阵 代表什么,matlab中矩阵AB是什么意思
Q1:matlab矩阵中的'代表什么意思 A(1)是指矩阵中的第一个元素. matlab中矩阵的排列是按照从上往下,从左往右的: 比如说,一列数,给转化为矩阵,排列如下: >> a=1:1 ...
- Matlab中矩阵卷积函数convn
Matlab中矩阵卷积函数convn 最近在看CNN做手写数字识别,其中CNN中Convolution在图像处理中就涉及了矩阵卷积.因为博主有了奥本海姆<信号与系统>中一维卷积的基础,这里 ...
- matlab中矩阵点乘和乘的区别(超级简单)
matlab中矩阵点乘和乘的区别 MATLAB中, 一.矩阵相乘:表示两个矩阵相乘. 二.矩阵点乘:表示矩阵中对应位置的元素分别相乘. 三.举例 3.1 矩阵相乘 3.2 矩阵点乘 MATLAB中, ...
- 矩阵期望 matlab,matlab中矩阵元素求和、求期望和均方差
在matlab中求一个矩阵中元素的和可以自己编写for循环来完成,这样比较方便,想求那些数据的和都可以做到,然而效率比较低,如果数据量大程序会跑好长时间.所以我们可以转而用matlab提供的sum函数 ...
- matlab中m文件是什么,MATLAB中M文件的使用
运行方法: 使用matlab的时候,可以在"Command Window"内直接书写matlab代码,也可以将代码保存到M文件中,然后运行该文件.使用matlab主界面菜单&quo ...
最新文章
- UE卡通风格游戏场景制作视频教程
- [原创]Android Monkey 在线日志分析工具开发
- 《Unreal Engine 4蓝图可视化编程》一1.6 改变目标方向
- Qt Creator使用版本控制系统
- BZOJ1010玩具装箱 - 斜率优化dp
- 如何合理的配置线程数?
- mac中rabbitmq的安装
- 数据库链接池c3p0配置踩坑
- mysql左连接右连接内连接的含义_MySQL-解释左连接,右连接,内连接,全连接
- c语言输入m行m列的二维数组,编写一个函数,用于计算具有n行和m列的二维数组中指定列的平均值以及数组各行的和的最小值。...
- LFW database
- ba无标度网络python_python绘制BA无标度网络
- Python3.6+selenium2.53.6自动化测试_禅道新增BUG(一)(本地禅道)
- tfidf关键词提取php,TFIDF介绍
- 【漏洞利用】逻辑漏洞之任意账号密码重置详解
- c语言中线性与非线性,最小二乘法 线性与非线性拟合
- MySQL Workbench建表时的PK,NN,UQ,B,UN,ZF,AI,G
- oracle常见单词_oracle认证考试中,常用单词汇总
- 测评 | 谷歌智能耳机Pixel Buds体验:耳朵里的语音助手
- 关于“‘c‘ argument has 1 elements, which is not acceptable for use with ‘x‘ with size 300“的解决办法