Adding elements to the ends of vectors inside a cell array of vectors

조회 수: 4 (최근 30일)
Is there a way to add elements to the ends of vectors that are inside a cell array of vectors which would be faster than the following code that uses a for-loop?
x = rand(1,20);
i1 = [1,7,11];
i2 = [6,10,20];
xLower = [0.1 0.2 0.3];
xUpper = [100 200 300];
tic();
for r = 1:length(i1)
xRegion{r} = [xLower(r) x(i1(r):i2(r)) xUpper(r)];
end
toc();
xRegion

채택된 답변

Eike Blechschmidt
Eike Blechschmidt 2021년 7월 29일
You could use arrayfun:
arrayfun(@(l,i1,i2,u) [l x(i1:i2) u], xLower,i1,i2, xUpper, uniform, false)
This is untested but should be faster.
  댓글 수: 8
Eike Blechschmidt
Eike Blechschmidt 2021년 8월 1일
편집: Eike Blechschmidt 2021년 8월 1일
You have to differentiate between allocating the cell array and allocating for the actual content of the cell array. Basically your cell array is just storing a bunch of pointers to the actual arrays of double you create in your for loop.
So it would only make sense to do the following which in your current example does not bring any benefit as i1 is quite small (I tried that on my machine):
xRegion = cell(size(i1))
I don't know a way to pre allocate memory for the created double arrays from your loop which would not involve a loop.
Depending on how you later processes the data it could could be worth trying just to use a pre-allocated doble array instead and set all not needed fields to nan. Again just gussing if that even does speed up your code.
arrSize = i2 - i1 + 3;
xRegion1 = nan(length(i1), max(i2 - i1 + 2));
for r = 1:length(i1)
xRegion1(r, 1:arrSize(r)) = [xLower(r) x(i1(r):i2(r)) xUpper(r)];
end
Mark Szlazak
Mark Szlazak 2021년 8월 2일
Thanks for the explanation on this type of pre-allocation.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by