Fastest way for variable row indexing
14 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi all, I am trying to speed up my code, but cannot find a faster way than a loop and I think there should be one (probably). So the problem is the following: I have a 2D array V and need to set a variable amount of consecutive columns to A and the rest to B (for simplicity). Variable means each row is different and up to where each row has to be set to A is stored in L. So currently it looks like this:
for c = 1 : size(V,1)
V(c,:) = [repmat(A,1,L(c)) repmat(B,1,size(V,2)-L(c))]
end
So does anyone know a faster solution? If the index would be identical per row it would be easily achievable using repmat or bsxfun, but I could not figure out a way to use indices of different length for every row of the matrix. Same for sub2ind which only seems to work if the indices per row have the same length. Btw., only speed matters, the solution can be ugly ;) Any help would be greatly appreciated!
2 commentaires
Image Analyst
le 19 Mar 2017
Give a small numerical example with values for L, V, B, and A. Also let us know what version of MATLAB you have, especially if it's R2016b or later.
Réponses (2)
Philip Borghesani
le 19 Mar 2017
I made two changes to your code on my machine it is a bit faster:
- Avoid using repmat and concatination instead use direct assignment.
- Work with a transposed matrix and transpose when done.
The second change will help more or less depending on the image size and processor memory caching configuration. Larger images will make a bigger difference.
A = 1;
B = 2;
L = ceil(rand(1,2000)*1000);
V = nan(1000,2000);
tic
for c = 1 : size(V,2)
V(1:L(c),c) = A;
V(L(c)+1:end,c) = B;
end
V=V';
toc
imagesc(V)
2 commentaires
Walter Roberson
le 20 Mar 2017
3 commentaires
Walter Roberson
le 24 Mar 2017
%these can be set up ahead of time
M = 200; N = 100;
T = 1 : N;
%you could change these each loop iteration if desired
A = 1;
B = 2;
%if A and B are constant you could initialize this outside the loop
W = A + zeros(M, N);
%this would be done each loop, for sure.
L = ceil(rand(M,1)*N);
V = W;
V( bsxfun( @lt, L, T) ) = B; %your one-liner.
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!