Repeating a task for each row without loop
4 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Jonathan Pelletier-Marcotte
il 27 Mar 2018
Commentato: Jonathan Pelletier-Marcotte
il 27 Mar 2018
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 Commenti
Bob Thompson
il 27 Mar 2018
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.
Risposta accettata
Jan
il 27 Mar 2018
Modificato: Jan
il 27 Mar 2018
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.
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Loops and Conditional Statements in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!