Repeating a task for each row without loop
조회 수: 6 (최근 30일)
이전 댓글 표시
Jonathan Pelletier-Marcotte
2018년 3월 27일
댓글: Jonathan Pelletier-Marcotte
2018년 3월 27일
I'd like to do this expression without a loop,
x = [1, 1; 2, 2; 3, 3; 4, 7; 8, 8; 9, 9; 10, 15; 16, 16; 17, 17];
for i = 1:size(x,1)
y(i,1) = {[x(i,1):x(i,2)]}
end
Thanks in advance,
댓글 수: 4
Bob Thompson
2018년 3월 27일
Ok. I personally don't know of a way to conduct a specific operation for each row of a matrix without defining a loop to run through the rows. It might be possible with some fancy indexing, but I don't know how.
채택된 답변
Jan
2018년 3월 27일
편집: Jan
2018년 3월 27일
Instead of avoiding the loop, start with a clean version with pre-allocation:
x = [1, 1; 2, 2; 3, 3; 4, 7; 8, 8; 9, 9; 10, 15; 16, 16; 17, 17];
n = size(x, 1);
y = cell(n, 1);
for k = 1:n
y{k} = x(k,1):x(k,2);
end
This has several improvements:
- With a pre-allocation before the loop, the array does not grow iteratively. Remember that creating an array iteratively, Matlab has to create a new array and copy the old contents in each iteration. For a 1xN array this needs to reserve memory for sum(1:N) elements and this is growing extremely fast.
- y(i,1) = {...} creates a cell on the right side only to copy its elements to the left side. The creation of the temporary cell can be saved by using the curly braces on the left side: y{i,1} = ...
- a:b is a vector already. Including it in square brackets concatenates it with nothing. Therefore [a:b] is a waste of time. See Avoid square brackets .
- The link about brackets might be useful: Are you sure that storing the index vectors explicitly is useful? Remember that:
y = x(a:b);
is faster than:
v = a:b;
y = x(v);
So maybe your Nx2 matrix is the best way to store the indices already. Then searching for a vectorized way to convert it might be a bad idea in general.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!