matlab中把矩阵分解为列向量
供稿:hz-xin.com 日期:2025-01-14
用matlab语言怎么将一个秩为1的矩阵分解成列向量和行向量相乘形式
比如
A=[1,2;3,4;5,6]
sum(A)可以写成[1,1,1;1,1,1]*A
我有两点疑问:
161051*75287520这么大的矩阵,MATLAB根本读不进来。(我粗算了一下占用内存约几十万个G)除非是用稀疏矩阵。
所以我对你的问题表示怀疑,因为你没有办法将这些数一次读进MATLAB,更不用说处理它了。如果读不进来的话,那么什么办法都是白谈。
另外一种就是直接读文件,然后循环处理,但是它的大小是几十万个G,这使得此方法可能也不可取。
%%%%%%%%%%%%%%%%%%%%%
我看了你的问题,我觉得你还是把你的本意说清楚一些。
想做什么,而不是实现什么。
对于你这个问题,你应当不用组装起所有你的那么大的矩阵。
另外:
A是-5:1:5选5个里面所有的排列,有161051*5;这个好像有问题。从多少个里面选五个,好像都不是161051这个数。
%%%%%%%%%%%%%%
建议你得自己写排列组合的程序,用循环的方式来弄。
数据量小的话,可以一次把所有的可能生成出来,数据量大,根本没有办法把所有可能一次弄出来。
用循环的话,我不建议你用MATLAB,因为MATLAB对于矩阵计算优势很大,但对于循环并不是它的强项。
A=[1,2;3,4;5,6]
A(:,1)和A(:,2)就是相应的列向量[1;3;5]和][2;4;6]
A(:,1)意思是矩阵A的任意行第一列,以此类推
列多的话肯定要用循环了,好像没有直接对列进行运算的函数,循环也很简单呀
楼上的方法是有明显缺陷的,比如对于 A=[0 0; 0 1] 就完全失效。
可以用SVD来做,[u,s,v]=svds(A,1),那么A=u*s*v'
不需要用循环,直接一个语句即可:
a=rand(10000,1); % 测试数据
b1=mean(reshape(a,[100 100]),2);
含义是,把原10000x1的列向量转换成100x100的矩阵,其中第1列是a的1-100个元素,第2列是a的101-200个元素,依次类推。然后求平均值是沿着第2维,也就是把100个100x1的列向量对应位置的元素求平均。
当然,如果你一定想要循环也可以,那样应该是
for n=1:100,
b(n)=mean(a(n:100:end));
end
你可以验证,两种做法的结果相同
isequal(b1,b')
比如
A=[1,2;3,4;5,6]
sum(A)可以写成[1,1,1;1,1,1]*A
我有两点疑问:
161051*75287520这么大的矩阵,MATLAB根本读不进来。(我粗算了一下占用内存约几十万个G)除非是用稀疏矩阵。
所以我对你的问题表示怀疑,因为你没有办法将这些数一次读进MATLAB,更不用说处理它了。如果读不进来的话,那么什么办法都是白谈。
另外一种就是直接读文件,然后循环处理,但是它的大小是几十万个G,这使得此方法可能也不可取。
%%%%%%%%%%%%%%%%%%%%%
我看了你的问题,我觉得你还是把你的本意说清楚一些。
想做什么,而不是实现什么。
对于你这个问题,你应当不用组装起所有你的那么大的矩阵。
另外:
A是-5:1:5选5个里面所有的排列,有161051*5;这个好像有问题。从多少个里面选五个,好像都不是161051这个数。
%%%%%%%%%%%%%%
建议你得自己写排列组合的程序,用循环的方式来弄。
数据量小的话,可以一次把所有的可能生成出来,数据量大,根本没有办法把所有可能一次弄出来。
用循环的话,我不建议你用MATLAB,因为MATLAB对于矩阵计算优势很大,但对于循环并不是它的强项。
A=[1,2;3,4;5,6]
A(:,1)和A(:,2)就是相应的列向量[1;3;5]和][2;4;6]
A(:,1)意思是矩阵A的任意行第一列,以此类推
列多的话肯定要用循环了,好像没有直接对列进行运算的函数,循环也很简单呀