Asked by C Zeng
on 6 Jun 2013

Hi, all, again, I want to do the work quickly: I have a large matrix A, and I want to assign value in some entry in each row.

For example: A=zeros(4); a=[1,2; 2,3; 3,2; 4,1];

I want (1,2), (2,3),(3,2), (4,1) of matrix A be 1. How shall I make it work in no more than 3 commands?

What I am doing now is using loops:

for i=1:4 A(a(i,1),a(i,2)=1; end

However, as i is very large like 3^14, the program is very slow. So I wonder is there a way to speed the programming?

Thanks.

*No products are associated with this question.*

Answer by Walter Roberson
on 6 Jun 2013

Accepted answer

idx = sub2ind(size(A), [1 2 3 4], [2 3 2 1]); A(idx) = 1;

Sean de Wolski
on 6 Jun 2013

I've always found `for`-loops to be significantly faster than `sub2ind` and `ind2sub`. Especially as the number of indices gets large.

It's been a few years since I was timing it for my own work though...

Answer by Azzi Abdelmalek
on 6 Jun 2013

A=zeros(4); a=[1,2; 2,3; 3,2; 4,1]; idx= sub2ind(size(A),a(:,1),a(:,2)); A(idx)=1

Answer by Sean de Wolski
on 6 Jun 2013

I've always found `for`-loops to be significantly faster than `sub2ind` and `ind2sub`. Especially as the number of indices gets large.

It's been a few years since I was timing it for my own work though...

Show 9 older comments

Sean de Wolski
on 7 Jun 2013

Well a few things real quick:

prMatrix = diag(pr);

Skips the first `for`-loop and call to `zeros()`

Second, you migh twant to consider taking the outer for-loop and converting it to a `parfor` with the Parallel Computing Toolbox. This would allow this to work in Parallel, over a few workers and speed things up that way.

Alternatively, just run it over the weekend or overnight, at two times total and 556 seconds, that's still only 20 minutes...

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi test

Learn moreOpportunities for recent engineering grads.

Apply Today
## 0 Comments