programing tip

Octave / Matlab : 벡터에 새 요소 추가

itbloger 2020. 10. 27. 07:55
반응형

Octave / Matlab : 벡터에 새 요소 추가


벡터가 x있고 요소 ( newElem) 를 추가해야합니다 .

-사이에 차이점이 있습니까?

x(end+1) = newElem; 

x = [x newElem];

?


x(end+1) = newElem 좀 더 강력합니다.

x = [x newElem]x행 벡터 인 경우 에만 작동 하고 열 벡터를 x = [x; newElem]사용해야 하는 경우 에만 작동합니다 . x(end+1) = newElem그러나 행 벡터와 열 벡터 모두에서 작동합니다.

그러나 일반적으로 성장하는 벡터는 피해야합니다. 이 작업을 많이 수행하면 코드가 크롤링 될 수 있습니다. 생각해보십시오 : 배열을 늘리려면 새 공간을 할당하고, 모든 것을 복사하고, 새 요소를 추가하고, 오래된 엉망을 정리하는 작업이 포함됩니다 ... 정확한 크기를 미리 알고 있다면 시간 낭비입니다. :)


@ThijsW의 답변에 추가하기 만하면 연결 방법에 비해 첫 번째 방법에 상당한 속도 이점이 있습니다.

big = 1e5;
tic;
x = rand(big,1);
toc

x = zeros(big,1);
tic;
for ii = 1:big
    x(ii) = rand;
end
toc

x = []; 
tic; 
for ii = 1:big
    x(end+1) = rand; 
end; 
toc 

x = []; 
tic; 
for ii = 1:big
    x = [x rand]; 
end; 
toc

   Elapsed time is 0.004611 seconds.
   Elapsed time is 0.016448 seconds.
   Elapsed time is 0.034107 seconds.
   Elapsed time is 12.341434 seconds.

나는이 시간을 2012b에서 실행했지만 matlab 2010a에서 동일한 컴퓨터에서 동일한 코드를 실행했을 때

Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.

따라서 속도 이점은 최신 버전의 Matlab에만 적용되는 것 같습니다.


앞서 언급했듯이를 x(end+1) = newElem사용하면 벡터가 전치되었는지 여부에 관계없이 벡터를 스칼라와 연결할 수 있다는 장점이 있습니다. 따라서 스칼라 추가에 더 강력합니다.

그러나 잊지 말아야 할 것은 x = [x newElem]한 번에 여러 요소를 추가하려고 할 때도 작동 한다는 것입니다. 또한 이것은 행렬을 연결하려는 경우에 좀 더 자연스럽게 일반화됩니다.M = [M M1 M2 M3]


대체로 스칼라 일 수도 있고 아닐 수도있는 기존 벡터를 연결할 수있는 솔루션을 원한다면 다음 xnewElem같이 트릭을 수행해야합니다.

 x(end+(1:numel(newElem)))=newElem

참고URL : https://stackoverflow.com/questions/16188058/octave-matlab-adding-new-elements-to-a-vector

반응형