[请教]如何将列向量转换为上三角阵?
matlab读入了一列共(1+n)*n/2个数据,我想将它转换成n*n的上三角阵,不知道应该怎么写程序希望大家指教,谢谢~~ 不懂什么是上三角矩阵,举个例子出来:lol 那是个等差数列的和,要转化为n×n的对角矩阵还行,三角是么意思
回复 楼主 ferryday 的帖子
任何矩阵X皆可化为两个上下三角矩阵L及U的相乘, = lu(X)但楼主问的好像不是三角矩阵涵义
如何转换好像没有现成的m_function可直接使用
但我想 for loop应该不难 比如一个向量(1,2,3,4,5,6)
我想把它转换成
[1,2,3
4,5
6]
这样的形式。
是在用for写循环,但是循环里的通项公式总理不清楚:@Q
回复 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 编辑 ] 原帖由 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
谢谢指教~~ 本帖最后由 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 a=1:10;
b=find(triu(magic(4)));
c(4,4)=0;
c(b)=a; 本帖最后由 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' 回复 ChaChing 的帖子
1.magic(4)和ones(4)的效果一样,或者用其他的比如,pascal,rand等,也许ones更直观;
2.作为高级版本,a(4,4)要比zeros(4)的速度快一些,当然在有些地方是不便用前者的,
具体你可以参考吴鹏的《Matlab高效编程技巧于应用》
3.lz并没有说明这个数字的具体排列方式,所以我觉得我的程序是没有错误的
也可以这样d=1:10;
=meshgrid(1:4);
c(4,4)=0;
c(unique(bsxfun(@plus,max(a,b),(0:3)*4)))=d;
c=c' 用for循环就很好啊!现在的MATLAB都采用了JIT-Accelerator技术对循环进行了优化,使循环的执行速度不下于矢量化代码的执行速度,只要代码中不要包含以下数据类型或函数:
1.echo函数;
2.debugger模式;
3.改变变量的数据类型或改变变量的维数;
4.一行写多行代码;
5.调用其他非内建函数(build-ins),如自己编写的函数或或是mex文件等;
6.一些数据类型,如函数句柄(function handle),结构(structure),元胞(cell)等! 回复 zhouyang664 的帖子
你说的对
1.循环现在已经不是matlab的瓶颈,效率更多的是和循环顺序,循环内部代码等有关系
2.简化代码需要花时间,如果花更多的时间在简化代码,少用循环,反而会降低效率,但是如果不用花很多时间就更让代码简化,效果更高,未尝不是一件好事情。
3.简化代码是一种思维的训练,这是matlab这门语言的好处,锻炼发散思维,对我只是兴趣,体现编程的技巧而异
clear;clc;close all;
N=10;
num=;
a(N,N)=0;
=meshgrid(1:N,1:N);
a(find(m>=n))=num;
页:
[1]
2