2013-02-23 4 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 바이트)가 필요합니다. 그래서 나는 그것을 실행할 수 없다. 어떻게 개선하고 메모리 문제를 해결할 수 있습니다. 8Gb RAM이있는 win7 64를 사용하고 있습니다.

답변

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

사전 할당 배열은 메모리 적중을 줄입니다. 그렇지 않으면 여기에 메모리 최적화가 없습니다.

+0

예제 코드는 이미 미리 할당되어 있습니다. – shoelzer

2

더 적은 수를 사용하지 않으면 메모리 사용을 줄일 수 없습니다. itjt을 0.01 대신 0.01 씩 단계 씩 설정할 수 있습니까?

다음은 루프없이 결과 행렬을 작성하는 방법입니다.

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

크론이 당신의 일을해야한다고 말하려고 했었습니다. 좋은 비트. – 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

이 코드가 실행 된 후, 당신은 972,000,000 X의 형태로 매트릭스 LaserS으로 끝날 것을 의미에서 "아무것도"일을하지 것 같다 2.이 값들이 동시에 메모리에로드 될 필요가 있다면, 그것은 크기이며, 그렇게 할 필요가별로 없습니다.

내가 게시 한 코드에서 직접 추측 할 수없는 첫 번째 접근 방법은 추가 처리를 수행하는 동안 "즉시"매트릭스 데이터를 생성하면 프로그램의 전반적인 목표를 달성 할 수 있다는 것입니다. LaserS 이상.

희망이 도움이됩니다.

1

여기에 제시된 멋진 솔루션 외에도 메모리를 줄이려면 double을 사용할 이유가 없습니다. single과 필요한 메모리의 절반을 사용할 수 있습니다. 당신은 즉, 따라서 정수 uint16 같은 숫자를 인코딩 it=uint16(0:1:36000),이 메모리의 1/4 사용 (단위 단계로 스텝 크기 0.01를 인코딩 할 수 있습니다. 등 ...

+0

@ 좋은 제안이지만 각도 (도)의 값입니다. 나는 그것을 라디안으로 변환합니다. 그래서 1000 라인 코드를 변경하여 3600을 조정하는 것은 어려울 것입니다. 360 대신. – Shahgee

0

가 Meshgrid뿐만 아니라 명확하게이 작업을 수행 할 것입니다, (n * m) -by-2 행렬에 넣으 려한다면 모양이 바뀔 것입니다.하지만 그 이유는 무엇입니까? 실제로 다른 것 다음에있는 것처럼 보입니다. bsxfun (, jt ') 당신이 원하는 것을 할 수 있습니다.

관련 문제