2013-02-23 6 views
1

У меня есть две проблемы. Пожалуйста, смотрите followinf кодбез векторизации, векторизованный, 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 байт). Поэтому я не могу запустить его. Как я могу улучшить его и решить проблему с памятью. Я использую win7 64 с оперативной памятью 8 ГБ.

ответ

2

Что вы пытаетесь сделать? «reshape» должен решить вашу проблему.

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

Предопределяющий массив собирается сэкономить вам память. В противном случае здесь нет оптимизации памяти.

+0

Пример кода уже предварительно назначил. – shoelzer

2

Вы не можете уменьшить использование памяти, если не используете меньше значений. Может it и jt шаг 0,1 вместо 0,01?

Вот способ построения матрицы результатов без цикла.

LaserS = [rempat(it.', length(jt), 1), kron(ones(length(it), 1), jt.')]; 
+0

Я собирался сказать, что kron должен выполнить вашу работу. Хороший бит. – Arcturus

1

Это следует сделать это:

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

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

LaserS = [it, jt] 
2

Этот код, кажется, не делать «ничего» в том смысле, что, после того, как она работает, вы в конечном итоге с матрицей LaserS с формой 972000000 х 2. Если вам действительно нужно, чтобы эти значения загружались в память одновременно, это размер, и об этом мало что нужно сделать.

Что было бы моим первым подходом, который не может быть выведен непосредственно из кода, который вы опубликовали, заключается в том, что, возможно, вы можете достичь общей цели своей программы, если вы создаете матричные данные «на лету», пока выполняете дальнейшую обработку более LaserS.

Надеюсь, это поможет!

1

В дополнение к красивым решениям, представленным здесь уже, если вы хотите уменьшить память, нет причин использовать double. Вы можете использовать single и половину требуемой памяти. Вы можете кодировать размер 0.01 шага к шагу блока (то есть, таким образом it=uint16(0:1:36000) кодирующая числа как целые числа uint16, это будет использовать только один четверть памяти. И т.д ...

+0

@ приятное предложение, но это значение угла (градуса). Я конвертирую его в радиан, поэтому было бы сложно изменить 1000 строк кода для настройки 3600 вместо 360. – Shahgee

0

Meshgrid будет делать это аккуратно, как хорошо, возможно, с изменением формы, если вы настаиваете на том, чтобы это было в матрице (n * m) -by-2. Но зачем вам это нужно? Кажется, что вы на самом деле после чего-то другого, и возможно, что bsxfun (, it, jt ') будет делать то, что вы хотите.

Смежные вопросы