声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4674|回复: 19

[编程技巧] [请教]如何将列向量转换为上三角阵?

[复制链接]
发表于 2008-10-14 17:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
matlab读入了一列共(1+n)*n/2个数据,我想将它转换成n*n的上三角阵,不知道应该怎么写程序
希望大家指教,谢谢~~
回复
分享到:

使用道具 举报

发表于 2008-10-14 21:47 | 显示全部楼层
不懂什么是上三角矩阵,举个例子出来:lol
发表于 2008-10-14 22:33 | 显示全部楼层
那是个等差数列的和,要转化为n×n的对角矩阵还行,三角是么意思
发表于 2008-10-15 11:00 | 显示全部楼层

回复 楼主 ferryday 的帖子

任何矩阵X皆可化为两个上下三角矩阵L及U的相乘, [L,U] = lu(X)
但楼主问的好像不是三角矩阵涵义
如何转换好像没有现成的m_function可直接使用
但我想 for loop应该不难
 楼主| 发表于 2008-10-15 12:01 | 显示全部楼层
比如一个向量(1,2,3,4,5,6)
我想把它转换成
[1,2,3
       4,5
             6]
这样的形式。
是在用for写循环,但是循环里的通项公式总理不清楚:@Q
发表于 2008-10-15 13:11 | 显示全部楼层

回复 5楼 ferryday 的帖子

n=3; b=[1,2,3,4,5,6]; a=zeros(n,n); j=1;
for i=1:n, k=j:j+n-i; a(i,i:n)=b(k);j=j+n-i+1; end

[ 本帖最后由 ChaChing 于 2008-10-15 13:18 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-10-15 13:39 | 显示全部楼层
发表于 2010-9-8 10:05 | 显示全部楼层
本帖最后由 ChaChing 于 2010-9-8 19:03 编辑

回复 ferryday 的帖子

function m=f_ve2triu(v)
ll= length(v) ; p = floor(sqrt(2*ll)) ;
ix = 0 ; il = p ; m = NaN * zeros(p) ;
for ic = 1:p
  m ( (ic:p) , ic ) = v ( (ix+1:ix+il) ) ;
  m ( ic, ((ic+1):p)) = m(((ic+1):p),ic)' ;
  ix = ix + il ; il = il - 1 ;
end
m=triu(m);

% Example
v=1:10
m=f_ve2triu(v) %or m=f_ve2triu(v')
m =
     1     2     3     4
     0     5     6     7
     0     0     8     9
     0     0     0    10   

评分

1

查看全部评分

发表于 2010-9-8 17:29 | 显示全部楼层
  1. a=1:10;
  2. b=find(triu(magic(4)));
  3. c(4,4)=0;
  4. c(b)=a;
复制代码

评分

1

查看全部评分

发表于 2010-9-8 18:52 | 显示全部楼层
本帖最后由 ChaChing 于 2010-9-9 00:56 编辑

回复 qibbxxt 的帖子
个人以为magic(4)改用ones(4), c(4,4)=0;改用zeros(4);好像更直觉!
还有好像有个小错误!
a=1:10; b=find(tril(ones(4)));
c=zeros(4); c(b)=a; c=c'
发表于 2010-9-8 20:52 | 显示全部楼层
回复 ChaChing 的帖子
1.magic(4)和ones(4)的效果一样,或者用其他的比如,pascal,rand等,也许ones更直观;
2.作为高级版本,a(4,4)要比zeros(4)的速度快一些,当然在有些地方是不便用前者的,
  具体你可以参考吴鹏的《Matlab高效编程技巧于应用》
3.lz并没有说明这个数字的具体排列方式,所以我觉得我的程序是没有错误的

   
发表于 2010-9-8 21:21 | 显示全部楼层
也可以这样
  1. d=1:10;
  2. [a,b]=meshgrid(1:4);
  3. c(4,4)=0;
  4. c(unique(bsxfun(@plus,max(a,b),(0:3)*4)))=d;
  5. c=c'
复制代码

评分

1

查看全部评分

发表于 2010-9-8 21:33 | 显示全部楼层
用for循环就很好啊!现在的MATLAB都采用了JIT-Accelerator技术对循环进行了优化,使循环的执行速度不下于矢量化代码的执行速度,只要代码中不要包含以下数据类型或函数:
1.echo函数;
2.debugger模式;
3.改变变量的数据类型或改变变量的维数;
4.一行写多行代码;
5.调用其他非内建函数(build-ins),如自己编写的函数或或是mex文件等;
6.一些数据类型,如函数句柄(function handle),结构(structure),元胞(cell)等!

评分

1

查看全部评分

发表于 2010-9-8 21:57 | 显示全部楼层
回复 zhouyang664 的帖子
你说的对
1.循环现在已经不是matlab的瓶颈,效率更多的是和循环顺序,循环内部代码等有关系
2.简化代码需要花时间,如果花更多的时间在简化代码,少用循环,反而会降低效率,但是如果不用花很多时间就更让代码简化,效果更高,未尝不是一件好事情。
3.简化代码是一种思维的训练,这是matlab这门语言的好处,锻炼发散思维,对我只是兴趣,体现编程的技巧而异
   
发表于 2010-9-8 22:39 | 显示全部楼层
  1. clear;clc;close all;
  2. N=10;
  3. num=[1:N*(N+1)/2];
  4. a(N,N)=0;
  5. [m,n]=meshgrid(1:N,1:N);
  6. a(find(m>=n))=num;
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-18 17:22 , Processed in 0.067889 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表