# Fastest way to substitute elements in a matrix at given positions?

3 views (last 30 days)
Torquato Garulli on 15 Oct 2019
Commented: Torquato Garulli on 16 Oct 2019
Good evening,
suppose I have an array A with size (n,m) and an array B with size (n,l), with l<m.
Suppose elements of array B point to elements of array A in the following fashion:
• B(x,y) --> A(x, B(x,y))
What is the fastest way to substitute all elements of A that are pointed by elements of B with a given value? At present I am using for loops but I guess they are not very efficient.
Also, would it be different if matrix A would be generated by repetition of the same known row n times?
Thanks a lot for any help or hint you are willing to give!!

Matt J on 15 Oct 2019
idx = sub2ind([n,m], repmat((1:n).',1,l) ,B);
A(idx)=value;

Torquato Garulli on 16 Oct 2019
Than using loops
Matt J on 16 Oct 2019
It depends on what the code for the loop looks like. Generally speaking though, Matlab's JIT compiler can do some things to optimize M-coded for-loops, but is limited by the complexity of operations done inside the loop and your Matlab version, of course.
If you can avoid M-Coded for-loops, as my solution does, it often leads to better performance because it doesn't rely on the JIT. It is just running pre-compiled C/C++ code internally.
Torquato Garulli on 16 Oct 2019
I see!
Thanks a lot!