필터 지우기
필터 지우기

Faster method of creating list of looped row vectors?

조회 수: 2 (최근 30일)
mfas
mfas 2015년 7월 6일
댓글: mfas 2015년 7월 6일
At the moment I have the following code:
kres=1;
kz=0;
K=[];
for kx=-3:kres:3
for ky=-3:kres:3
k=[kx,ky,kz];
K=[K;k];
end
end
to achieve a list of row vectors in the form:
[-3,-3,0;-3,-2,0;-3,-1,0;-3,0,0;....;3,2,0;3,3,0]
However when kres is reduced to < 0.01 this loop takes a long time to compute. Is there a faster way to achieve the same result without having to have a loop within a loop?

채택된 답변

Bjorn Gustavsson
Bjorn Gustavsson 2015년 7월 6일
kres=1; kz=0; K=[]; This is the way I'd go about it:
x = -3:kres:3;
y = -3:kres:3;
z = 0;
[x,y,z] = meshgrid(x,y,z);
K = [x(:),y(:),z(:)];
HTH

추가 답변 (2개)

Keith Hooks
Keith Hooks 2015년 7월 6일
You'll see quite a bit of improvement if you pre-allocate K. I understand the coding is not as clean, but the speed improvement is close to 5X for the 0.1 resolution.
Original: Elapsed time is 0.027472 seconds .
With pre-allocation: Elapsed time is 0.005479 seconds .
kres=.1;
kz=0;
kx = -3:kres:3;
ky = -3:kres:3;
n = length(kx);
m = length(ky);
K=zeros(n*m,3);
for i=1:n
for j=1:m
k=[kx(i),ky(j),kz];
K((i-1)*n + j,:) = k;
end
end

Thorsten
Thorsten 2015년 7월 6일
편집: Thorsten 2015년 7월 6일
kres=0.01;
kx = -3:kres:3;
N = numel(kx);
k1 = repmat(kx, [N 1]);
K2 = [k1(:) repmat(kx', [N 1]) repmat(0, [N^2 1])];

카테고리

Help CenterFile Exchange에서 Sparse Matrices에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by