1

我有两个问题。请看followinf代码

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。

4

6 回答 6

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.'];

预分配数组将节省您的内存命中。否则这里没有内存优化。

于 2013-02-23T15:32:49.460 回答
2

除非您使用更少的值,否则您无法减少内存使用量。可以itjt一步 0.1 而不是 0.01?

这是一种无需循环即可构建结果矩阵的方法。

LaserS = [rempat(it.', length(jt), 1), kron(ones(length(it), 1), jt.')];
于 2013-02-23T15:33:13.103 回答
2

从某种意义上说,这段代码似乎“什么也不做”,在它运行之后,你最终得到的矩阵LaserS的形状为 972000000 x 2。如果你真的需要同时将这些值加载到内存中,那就是大小,没有什么可做的。

我的第一种方法是什么,不能直接从您发布的代码中推断出来,如果您在执行进一步处理时“动态”生成矩阵数据,也许您可​​以实现程序的总体目标LaserS

希望这可以帮助!

于 2013-02-23T15:47:59.957 回答
1

这应该这样做:

it = it(:);
jt = jt(:);

jt = repmat(jt,size(it,1),1)
it = repmat(it',size(jt,1),1);
it = it(:);

LaserS = [it, jt]
于 2013-02-23T15:37:01.150 回答
1

除了这里已经介绍的不错的解决方案,如果你想减少内存,没有理由使用double. 您可以使用single所需内存的一半。您可以将步长编码0.01为单位步长(也就是说,it=uint16(0:1:36000)将数字编码为整数uint16,这将只使用四分之一的内存。等等......

于 2013-02-24T09:31:47.617 回答
0

Meshgrid 也会干净利落地执行此操作,如果您坚持将其置于 (n*m)-by-2 矩阵中,则可能会进行重塑。但是你为什么想要那个?看起来你实际上是在追求别的东西,而且 bsxfun(,it,jt') 可能会做你想做的事。

于 2013-02-24T09:46:23.037 回答