我有两个问题。请参阅以下代码
it=0:0.01:360;
jt=0:0.01:270;
LaserS=zeros(size(it,2)*size(jt,2),2);
p=1;
for m=it
for n=jt
LaserS(p,:)=[m,n];
p=p+1;
end
end
它非常慢并且还需要大量内存(大约7.7765e + 009字节)。所以我无法运行它。我该如何改进它并解决内存问题。 我正在使用带有8Gb RAM的win7 64。
答案 0 :(得分:2)
你想做什么? '重塑'应该可以解决你的问题。
LaserS=zeros(size(it,2)*size(jt,2),2);
JT=reshape(repmat(jt,[1,numel(it)]),1,numel(jt)*numel(it));
IT=reshape(repmat(it,[numel(jt),1]),1,numel(jt)*numel(it));
LaserS = [JT.', IT.'];
预分配数组将为你节省内存。否则这里没有内存优化。
答案 1 :(得分:2)
除非使用较少的值,否则无法减少内存使用量。 it
和jt
可以逐步增加0.1而不是0.01?
这是一种在没有循环的情况下构建结果矩阵的方法。
LaserS = [rempat(it.', length(jt), 1), kron(ones(length(it), 1), jt.')];
答案 2 :(得分:2)
这个代码似乎在做什么“没有”,在它运行之后,你最终得到了形状为972000000 x 2的矩阵LaserS
。如果你真的需要加载这些值记忆在同一时间,就是大小而且没什么可做的。
我的第一种方法是什么,无法直接从您发布的代码中推断出来,如果您在执行进一步处理时“动态”生成矩阵数据,也许您可以实现程序的总体目标LaserS
。
希望这有帮助!
答案 3 :(得分:1)
这应该这样做:
it = it(:);
jt = jt(:);
jt = repmat(jt,size(it,1),1)
it = repmat(it',size(jt,1),1);
it = it(:);
LaserS = [it, jt]
答案 4 :(得分:1)
除了此处介绍的优秀解决方案之外,如果您想减少内存,则没有理由使用double
。您可以使用single
和一半所需的内存。您可以将步长0.01
编码为单位步长(即it=uint16(0:1:36000)
,从而将数字编码为整数uint16
,这将只使用内存的四分之一。等等...
答案 5 :(得分:0)
如果你坚持在(n * m)-by-2矩阵中使用它,那么Meshgrid也可以干净利落地完成这项任务。但是你为什么要这样呢?看起来你实际上是在追求其他东西,并且bsxfun(,它,jt')可能会做你想要的。