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)

原创文章,转载请注明。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Programming C#.Classes and Objects.只读字段

只读字段 当字段声明中含有 readonly 修饰符时,该声明所引入的字段为只读字段。给只读字段的直接赋值只能作为声明的组成部分出现,或在同一类中的实例构造函数或静态构造函数中出现。(在这些上下文中,只读字段可以被多次赋值。&am…

会计知识

毛利 等于收入纯利 等于利润 按照:利润=收入-成本-费用 收入:收到的现金、支票、签单金额成本:买材料、酒水、电、工资、等费用:日租金、桌椅、碗、盘子等摊销、税金等等 ------------------------------------------…

2020-12-21

蜂鸣器(向导辅助) /******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator ?Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpin…

xgboost 一般多少棵树_大白话人工智能算法-第32节集成学习之通俗理解XGBoost原理和过程...

本节讲解XGBoost的原理~目录1、回顾:1.1 有监督学习中的相关概念1.2 回归树概念1.3 树的优点2、怎么训练模型:2.1 案例引入2.2 XGBoost目标函数求解3、XGBoost中正则项的显式表达4、如何生长一棵新的树?5、xgboost相比原始GBDT的优化&#xf…

C++函数中返回引用和返回值的区别

https://www.cnblogs.com/JMLiu/p/7928425.html转载于:https://www.cnblogs.com/liuw-flexi/p/10745246.html

scala编程第16章学习笔记(1)

List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得除最后一个元素之外的元素 reverse:反转…

struts

Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了…

css实现元素在div底部显示

#CSS .1 {position:relative;} .2 {position:absolute;left;0;bottom:0;} #HTML <div class"1"> <div class"2"></div> </div> 不影响其他元素的情况下定位最好...如果 DIV1 里 只有 DIV2 的话 在DIV2 CSS样式里 加一个 margin-to…

css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器

上篇关于Go模板库应用实践的文章最后我们留下一个问题&#xff0c;页面模板是通过 CDN引用的 BootStrap的 css&#xff0c; js文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过 Nginx服务器的一定知道 Nginx天然支持…

【linux】学习2

鸟哥那本书的第6章 文件权限&#xff1a; ^ ^ ^ ^ ^ ^ ^ 1 2 3 4 5 6 7 文件有 文件所有者、文件所属用户组 的概念如上图. 1. 十个字母表示文件…

IE 8 开发人员工具详解 【转载】

我的体会&#xff0c;IE 8 较之前面的的版本还是有不少改进的。使用体验上好很多&#xff0c;速度也不错。IE 要继续加油&#xff0c; 对于网页开发人员&#xff0c;IE8也提供了一个所谓的开发人员工具&#xff0c;通过F12可以调用出来 关于这套工具的使用细节&#xff0c;我就…

scrollwidth ,clientwidth ,offsetwidth 三者的区别

clientwidth:内容可视区域的宽度 offsetwidth:元素整体宽度 scrollwidth:实际内容的宽度 转载于:https://www.cnblogs.com/cuijin-book/p/10760656.html

python运算符与表达式

2019独角兽企业重金招聘Python工程师标准>>> 运算符用于连接两个相同类型的序列&#xff0c;s*n用于创建一个序列的n个副本。但是这些都是仅仅复制元素引用的浅复制。 例&#xff1a; a[3,4,5] b[a] c2*b 则c[[3,4,5],[3,4,5]] a[0]-7; 则c[[-7,4,5],[-7,4,5]]. 也…

3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果

这是自定义转场系列的第四篇。由于具有一定的连续性&#xff0c;我会忽略一些基础&#xff0c;所以如果你是第一次看这个系列&#xff0c;可以先过目之前的几篇 ——— UIViewControllerTransitioning的用法 、实现Keynote中的神奇移动效果、实现通过圆圈放大缩小的转场动画。老…

[转]算术编码+统计模型=数据压缩 - 第二部分:统计模型

转自&#xff1a;http://deercrane.spaces.live.com/blog/cns!8BEF692B75EB8095!189.entry 算术编码 统计模型 数据压缩 - 第二部分&#xff1a;统计模型 &#xff08;撼庭秋译自http://compression.graphicon.ru/download/articles/ppm/nelson/arithmetic2.htm&#xff09; …

链式栈的实现(头文件及源程序)

链式栈的实现&#xff08;头文件及源程序&#xff09; Linkedstack.h #ifndef __LINKEDSTACK_H__ #define __LINKEDSTACK_H__//元素类型定义 typedef int ElemType_stack;//结点结构体类型定义 typedef struct Node_stack {ElemType_stack data;struct Node_stack *next;stru…

phper必知必会之类库自动加载的七种方式(三)

## php自动加载 下面显示例子的文件目录结构图 一、没有使用命名空间的几种实现 test/oneClass.php class oneClass{public function show(){echo "这里是oneClass.php的show方法<br/>";}} test/twoClass.php <?phpclass twoClass{public function show(){…

怎样的项目才算是一个成功的项目 于病视神,未有形而除之

http://www.nowamagic.net/librarys/veda/detail/2466参与各种项目已经好几年了&#xff0c;大大小小的项目也做过了很多。经历了很多&#xff0c;也明白了很多。现在反思下&#xff0c;什么样的项目才是成功的项目&#xff1f; 是把项目按照必要的约束&#xff08;时间&#x…

sqlserver55555_sqlserver把小数点后面多余的0去掉

Sql中想把小数点后多余的0去掉,怎么办?select 5000/10000.0 --想变成0.5select 5500/10000.0 --想变成0.55select 5550/10000.0 --想变成0.555select 5555/10000.0 --想变成0.5555其结果分别为&#xff1a;0.5000000 0.5500000 0.5550000 0.5555000一、如果想去掉数字5后…