matlab柱状斜线_Matlab小练习:按斜线方向依次赋值矩阵
来自知乎问题,觉得挺有意思,留给学生解答之余,我也做了一番思考,得到三种解法。
题目如下:
以n=80为例,
————————————————————
一、先要根据
确定矩阵的阶数
如果先生成足够大矩阵,再删掉全为零的列,有点太low了。所以先思考一个算法:
观察数据放置的特点,不难发现这样一个关系:
变形:
观察,若
足够大,
起决定作用,
取整一定是
较小的
(或
) 对吗?试一试。
测试
至
:
n=1:56;
round(sqrt(2*n))
刚好是对的!
二、将
按斜线依次放置
无非是找到放置规律放数而已,放置就是用行标列标赋值,所以就是找行标、列标规律。
先写个数的方便观察规律,比如,
方法一. 行标、列标分别找规律
依次赋值的
行标:
共
组
个数
列标:
共
组
个数
(因为是
条斜线)
既然如此,按上述规律生成(拼接)行标、列标,再赋值即可。
编写函数:
functionA=DiagNum1(n)k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
%% 生成行标, 列标
I=[];
J=[];
for i=1:k
I=[I,1:i];
J=[J,i:-1:1];
end
IND=sub2ind(size(A),I,J); %二维索引转化为一维索引
A(IND(1:n))=1:n;
注意,生成行标列标索引后,[I, J]作为二维索引值,是不能直接用A([I,J])=1:n来赋值的,故做了二维索引到一维索引的转化。
测试函数:
DiagNum1(80)
方法二. 行标列标一起找规律
依次赋值的
行标和列标:
先是“和为
”的,再“和为
”的,再“和为
”的,……; 每个子组里面又是行标从小到大排列。
因此,先生成所有行标列标组合(
与
的笛卡尔积),第一关键字按"行标列标之和"排序,再第二关键字按行标排序,排好序的取出前
个,依次赋值
即可。
编写函数:
functionA=DiagNum2(n)k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
%% 生成所有下标组合(笛卡尔积)
[X,Y]=meshgrid(1:n,1:n);
subn=[X(:),Y(:)];
%% 选取索引并赋值
ind=sortrows([subn,sum(subn,2)],3); %对下标求和, 按该和排序, 已经满足要求
IND=sub2ind(size(A), ind(1:n,1),ind(1:n,2)); %选出前n个二维索引, 并转化为一维
A(IND)=1:n;
测试函数(略)
方法三. 用循环语句实现
用循环语句控制行标、列标按该规律出现,依次赋值:
编写函数:
functionA=DiagNum3(n)k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
val=1;
for m=1:k
for i=1:m
A(i,m+1-i)=val;
val=val+1;
if val>n
break;
end
end
end
注意,外层循环用
控制依次从第
列到第
列起始的斜线;对每条斜线,先循环
,从
到
;而始终有
.
测试函数(略)
三、稍微提升一下
只赋值
, 实用性不大,如果改进一下,对给定的一个向量
, 将
中的值依次按斜线方向赋值成矩阵呢?
非常简单,参数由
换成向量
, 则
的长度即为需要的
,再将最后赋值时用的
换成
即可。
改进的第一个函数:
functionA=DiagNum1(V)n=length(V);
k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
%% 生成行标, 列标
I=[];
J=[];
for i=1:k
I=[I,1:i];
J=[J,i:-1:1];
end
IND=sub2ind(size(A),I,J); %二维索引转化为一维索引
A(IND(1:n))=V;
改进的第二个函数:
functionA=DiagNum2(V)n=length(V);
k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
%% 生成所有下标组合(笛卡尔积)
[X,Y]=meshgrid(1:n,1:n);
subn=[X(:),Y(:)];
%% 选取索引并赋值
ind=sortrows([subn,sum(subn,2)],3); %对下标求和, 按该和排序
IND=sub2ind(size(A), ind(1:n,1),ind(1:n,2)); %选出前n个二维索引, 并转化为一维
A(IND)=V;
改进的第三个函数(稍有不同):
functionA=DiagNum3(V)n=length(V);
k=round(sqrt(2*n)); %确定矩阵阶数k
A=zeros(k);
val=1;
for m=1:k
for i=1:m
A(i,m+1-i)=V(val);
val=val+1;
if val>n
break;
end
end
end
若还要得到原问题的结果,只需这样调用函数即可:
DiagNum1(1:n)
DiagNum2(1:n)
DiagNum3(1:n)
原创文章,转载请注明。
matlab柱状斜线_Matlab小练习:按斜线方向依次赋值矩阵相关推荐
- matlab柱状斜线_matlab画柱状图,能否达到附件的效果。
本帖最后由 meatball1982 于 2012-5-9 19:05 编辑 bar.jpg (58.86 KB, 下载次数: 33) 2012-5-9 19:04 上传 baidu的. 主程序. 暂 ...
- matlab柱状斜线_Matlab:柱状图饼状图填充不同条纹
下面就是重点:如何把上述图像转换成黑白图像,并填充不同条纹. 首先,创建名为"applyhatch.m"的函数脚本. 在同一路径下. 代码如下:--复制即可. function a ...
- matlab怎么定义矩阵变量_MATLAB小技巧及策略制定实例
1.在命令窗口单击↑键,可以出现历史命令行(几天之内的都有),可以方便的回调变量 2.如果对公式遗忘或不清楚,可以点击命令行左侧的fx进行公式选择. 3.plot绘图可以使用命令,也可以选中所需变量在 ...
- Matlab点云处理及可视化第1期—基于KD树的邻域点搜索(柱状邻域、球状邻域及KNN)
目录 1 概述 2 代码实现 3 可视化验证 数据及完整代码获取方式: 观前提示:本文文字内容请勿直接用于论文写作,否则后果自负. 特别提示:<Matlab点云处理及可视化>系列文章旨在为 ...
- Matlab画柱状、饼状填充图(亲测可用)
Matlab画柱状.饼状填充图 1. 把下列代码保存为名为"applyhatch.m"的文件 function applyhatch(h,patterns,colorlis ...
- 【MATLAB基础绘图第2棒】绘制柱状/饼图填充图
MATLAB绘制柱状填充图 方法1:hatchfill2工具 1.1 案例1:柱状图填充 1.2 案例2:饼图填充 方法2:applyhatch函数 2.1 案例1:柱状图填充 2.2 案例2:饼图填 ...
- javascript柱状统计图表
工作需要,用javascript做一个统计图表: 完成后,做个笔记,大家分享一下,互相学习.其中还有点问题,还不是很完善. 其中参考了百度空间,中管理中心,访问统计,的js统计图表.但是应用上还是有差 ...
- Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...
Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一, 可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了 ...
- 如何展现两极化数据,Excel柱状断层图不二之选
点赞再看,养成习惯:至长反短,至短反长. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...
最新文章
- OpenAI首次推出数学定理推理模型GPT-f,23个推导结果被专业数据库收录
- [20150113]关于oracle的存储结构.txt
- JavaMelody应用监控使用指南
- mfc实现秒表小项目
- poj 2112 Optimal Milking(二分+Floyd+最大流)
- 回溯法解决01背包问题
- java sampling_Java机器学习库ML之三Sampling(采样)
- 如何解决IE6的3像素问题?
- 桌面消息提醒_手机消息总是延迟,真的是网速不行?3招教你找出捣鬼设置
- 鸿蒙手机播放音乐-第一集
- MinGW找不到Gcc的解决方法
- JavaScript的闭包与应用
- Java实现 蓝桥杯VIP 算法提高 彩票
- Pray for 京阿尼——愿逝者安息,伤者早日康复
- 区块链技术DIY--xmz
- 性能测试案例模板 性能测试用例模板
- 用纯python脚本玩转UU加速器
- SVG路径(path)中的圆弧(A)指令的语法说明及计算逻辑
- Linux读取文件内容命令
- SpaceBuilder-优秀的web2.0和社交平台