ferryday 发表于 2008-10-14 17:11

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

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

re-us 发表于 2008-10-14 21:47

不懂什么是上三角矩阵,举个例子出来:lol

express 发表于 2008-10-14 22:33

那是个等差数列的和,要转化为n×n的对角矩阵还行,三角是么意思

ChaChing 发表于 2008-10-15 11:00

回复 楼主 ferryday 的帖子

任何矩阵X皆可化为两个上下三角矩阵L及U的相乘, = lu(X)
但楼主问的好像不是三角矩阵涵义
如何转换好像没有现成的m_function可直接使用
但我想 for loop应该不难

ferryday 发表于 2008-10-15 12:01

比如一个向量(1,2,3,4,5,6)
我想把它转换成
[1,2,3
       4,5
             6]
这样的形式。
是在用for写循环,但是循环里的通项公式总理不清楚:@Q

ChaChing 发表于 2008-10-15 13:11

回复 5楼 ferryday 的帖子

n=3; b=; 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 编辑 ]

ferryday 发表于 2008-10-15 13:39

原帖由 ChaChing 于 2008-10-15 13:11 发表 http://www.chinavib.com/forum/images/common/back.gif
n=3; b=; 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
谢谢指教~~

cnzmw 发表于 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   

qibbxxt 发表于 2010-9-8 17:29

a=1:10;
b=find(triu(magic(4)));
c(4,4)=0;
c(b)=a;

ChaChing 发表于 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'

qibbxxt 发表于 2010-9-8 20:52

回复 ChaChing 的帖子
1.magic(4)和ones(4)的效果一样,或者用其他的比如,pascal,rand等,也许ones更直观;
2.作为高级版本,a(4,4)要比zeros(4)的速度快一些,当然在有些地方是不便用前者的,
具体你可以参考吴鹏的《Matlab高效编程技巧于应用》
3.lz并没有说明这个数字的具体排列方式,所以我觉得我的程序是没有错误的

   

qibbxxt 发表于 2010-9-8 21:21

也可以这样d=1:10;
=meshgrid(1:4);
c(4,4)=0;
c(unique(bsxfun(@plus,max(a,b),(0:3)*4)))=d;
c=c'

zhouyang664 发表于 2010-9-8 21:33

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

qibbxxt 发表于 2010-9-8 21:57

回复 zhouyang664 的帖子
你说的对
1.循环现在已经不是matlab的瓶颈,效率更多的是和循环顺序,循环内部代码等有关系
2.简化代码需要花时间,如果花更多的时间在简化代码,少用循环,反而会降低效率,但是如果不用花很多时间就更让代码简化,效果更高,未尝不是一件好事情。
3.简化代码是一种思维的训练,这是matlab这门语言的好处,锻炼发散思维,对我只是兴趣,体现编程的技巧而异
   

upc1984 发表于 2010-9-8 22:39

clear;clc;close all;
N=10;
num=;
a(N,N)=0;
=meshgrid(1:N,1:N);
a(find(m>=n))=num;
页: [1] 2
查看完整版本: [请教]如何将列向量转换为上三角阵?