非矢量化到矢量化,ma​​tlab

时间:2013-02-23 15:21:09

标签: matlab

我有两个问题。请参阅以下代码

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。

6 个答案:

答案 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)

除非使用较少的值,否则无法减少内存使用量。 itjt可以逐步增加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')可能会做你想要的。