来自知乎问题,觉得挺有意思,留给学生解答之余,我也做了一番思考,得到三种解法。

题目如下:

以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小练习:按斜线方向依次赋值矩阵相关推荐

  1. matlab柱状斜线_matlab画柱状图,能否达到附件的效果。

    本帖最后由 meatball1982 于 2012-5-9 19:05 编辑 bar.jpg (58.86 KB, 下载次数: 33) 2012-5-9 19:04 上传 baidu的. 主程序. 暂 ...

  2. matlab柱状斜线_Matlab:柱状图饼状图填充不同条纹

    下面就是重点:如何把上述图像转换成黑白图像,并填充不同条纹. 首先,创建名为"applyhatch.m"的函数脚本. 在同一路径下. 代码如下:--复制即可. function a ...

  3. matlab怎么定义矩阵变量_MATLAB小技巧及策略制定实例

    1.在命令窗口单击↑键,可以出现历史命令行(几天之内的都有),可以方便的回调变量 2.如果对公式遗忘或不清楚,可以点击命令行左侧的fx进行公式选择. 3.plot绘图可以使用命令,也可以选中所需变量在 ...

  4. Matlab点云处理及可视化第1期—基于KD树的邻域点搜索(柱状邻域、球状邻域及KNN)

    目录 1 概述 2 代码实现 3 可视化验证 数据及完整代码获取方式: 观前提示:本文文字内容请勿直接用于论文写作,否则后果自负. 特别提示:<Matlab点云处理及可视化>系列文章旨在为 ...

  5. Matlab画柱状、饼状填充图(亲测可用)

    Matlab画柱状.饼状填充图 1.     把下列代码保存为名为"applyhatch.m"的文件 function applyhatch(h,patterns,colorlis ...

  6. 【MATLAB基础绘图第2棒】绘制柱状/饼图填充图

    MATLAB绘制柱状填充图 方法1:hatchfill2工具 1.1 案例1:柱状图填充 1.2 案例2:饼图填充 方法2:applyhatch函数 2.1 案例1:柱状图填充 2.2 案例2:饼图填 ...

  7. javascript柱状统计图表

    工作需要,用javascript做一个统计图表: 完成后,做个笔记,大家分享一下,互相学习.其中还有点问题,还不是很完善. 其中参考了百度空间,中管理中心,访问统计,的js统计图表.但是应用上还是有差 ...

  8. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...

    Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一, 可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了 ...

  9. 如何展现两极化数据,Excel柱状断层图不二之选

    点赞再看,养成习惯:至长反短,至短反长. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...

最新文章

  1. OpenAI首次推出数学定理推理模型GPT-f,23个推导结果被专业数据库收录
  2. [20150113]关于oracle的存储结构.txt
  3. JavaMelody应用监控使用指南
  4. mfc实现秒表小项目
  5. poj 2112 Optimal Milking(二分+Floyd+最大流)
  6. 回溯法解决01背包问题
  7. java sampling_Java机器学习库ML之三Sampling(采样)
  8. 如何解决IE6的3像素问题?
  9. 桌面消息提醒_手机消息总是延迟,真的是网速不行?3招教你找出捣鬼设置
  10. 鸿蒙手机播放音乐-第一集
  11. MinGW找不到Gcc的解决方法
  12. JavaScript的闭包与应用
  13. Java实现 蓝桥杯VIP 算法提高 彩票
  14. Pray for 京阿尼——愿逝者安息,伤者早日康复
  15. 区块链技术DIY--xmz
  16. 性能测试案例模板 性能测试用例模板
  17. 用纯python脚本玩转UU加速器
  18. SVG路径(path)中的圆弧(A)指令的语法说明及计算逻辑
  19. Linux读取文件内容命令
  20. SpaceBuilder-优秀的web2.0和社交平台

热门文章

  1. css --- 清除浮动
  2. PHP 实现中文截取无乱码的方法
  3. 26 JSX深度剖析与使用技巧
  4. Solr管理页面 上
  5. IPython 使用记录
  6. MySQL日志分类及性能分析你应该知道的知识
  7. 远程连接mysql数据库注意点记录
  8. mysql大数据优化要注意的细节
  9. 使用iai_kinect2标定kinectV2相机
  10. 傅里叶变换应用——信号调制与解调