Vectorization of MATLAB/Octave loop -



Vectorization of MATLAB/Octave loop -

can for-loop vectorized further?

for = 1:length(formula) ttable(i,abs(formula(i,:))) = -1*formula(i,:); end

where formula matrix , ttable = nan(length(formula),max(max(abs(formula)))). thanks!

judging code, doing each row of ttable, wish utilize indices accessed abs(formula(i,:)) , set each of these locations -1*formula(i,:).

noting @divakar's clever spot, going assume each row has unique absolute values. in other words, each row should not have instances have a or -a in row, a number 1 size(formula,2). reason why because in computation of abs(formula(i,:)), -a , a map same column. conflict , allow overwriting same entry (thanks @divakar!)

what can each row of formula, convert these locations column-major indices access ttable. after, assign corresponding values of -1*formula ttable. in other words:

%// find columns should accessed columnindices = reshape(abs(formula).', 1, []); %// each column accessing, find corresponding row rowindices = reshape(repmat(1:size(formula,2), size(formula, 1), 1), 1, []); %// find column major indices need access overall indices = sub2ind(size(formula), rowindices, columnindices); %// take indices have computed above, , map them %// columns found before ttable(indices) = -1*formula.';

here little test created. based on same assumption of unique absolute values made before:

formula = [1 2 -3 4; 4 -2 3 1; 3 2 4 -1; -4 1 2 3]; ttable = nan(length(formula),max(max(abs(formula)))); formula = 1 2 -3 4 4 -2 3 1 3 2 4 -1 -4 1 2 3 ttable = nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan

using approach, get:

for = 1:length(formula) ttable(i,abs(formula(i,:))) = -1*formula(i,:); end ttable = -1 -2 3 -4 -1 2 -3 -4 1 -2 -3 -4 -1 -2 -3 4

using approach, get:

columnindices = reshape(abs(formula).', 1, []); rowindices = reshape(repmat(1:size(formula,2), size(formula, 1), 1), 1, []); indices = sub2ind(size(formula), rowindices, columnindices); ttable(indices) = -1*formula.'; ttable = -1 -2 3 -4 -1 2 -3 -4 1 -2 -3 -4 -1 -2 -3 4

if matrix small, computational overhead doing instead of for loop may larger , inefficient. however, if matrix larger, code may faster. either way, think for loop approach still good. jit should kick in for loops. if take @ post here when doing timing tests algorithm for loop used 1 of algorithms, for loop 1 of algorithms fastest. check here: matlab: subtracting matrix subsets specific rows

matlab octave vectorization

Comments

Popular posts from this blog

php - Android app custom user registration and login with cookie using facebook sdk -

django - Access session in user model .save() -

php - .htaccess Multiple Rewrite Rules / Prioritizing -