Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace specific matrix position with array value without using for loop in MATLAB

Tags:

matrix

matlab

can I know how can I replace values in specific matrix position without using for loop in MATLAB? I initialize matrix a that I would like to replace its value on specified row and column for each no. This has to be done a few time within num for loop. The num for loop is important here because I would want the update the value in the original code.

The real code is more complicated, I am simplifying the code for this question.

I have the code as follow:

a = zeros(2,10,15);



for num = 1:10

    b = [2 2 1 1 2 2 2 1 2 2 2 2 1 2 2]; 
    c = [8.0268 5.5218 2.9893 5.7105 7.5969 7.5825 7.0740 4.6471 ...
    6.3481 14.7424 13.5594 10.6562 7.3160 -4.4648 30.6280];

    d = [1 1 1 2 1 1 1 1 1 1 3 1 6 1 1];

    for no = 1:15
        a(b(no),d(no),no) = c(1,no,:)
    end

end

A sample output for, say no 13 is as follows:

a(:,:,13) =

  Columns 1 through 8

         0         0         0         0         0      7.3160       0         0
         0         0         0         0         0         0         0         0

  Columns 9 through 10

         0         0
         0         0

Thank you so much for any help I could get.

like image 664
loss Avatar asked Sep 21 '26 01:09

loss


2 Answers

It can be done using sub2ind, which casts the subs to a linear index. Following your vague variable names, it would look like this (omitting the useless loop over num):

a = zeros(2,10,15);
b = [2 2 1 1 2 2 2 1 2 2 2 2 1 2 2]; 
d = [1 1 1 2 1 1 1 1 1 1 3 1 6 1 1];
c = [8.0268 5.5218 2.9893 5.7105 7.5969 7.5825 7.0740 4.6471 ...
6.3481 14.7424 13.5594 10.6562 7.3160 -4.4648 30.6280];

% // we vectorize the loop over no:
no = 1:15;
a(sub2ind(size(a), b, d, no)) = c;
like image 92
Nras Avatar answered Sep 23 '26 18:09

Nras


Apart from the sub2ind based approach as suggested in Nras's solution, you can use a "raw version" of sub2ind to reduce a function call if performance is very critical. The related benchmarks comparing sub2ind and it's raw version is listed in another solution. Here's the implementation to solve your case -

no = 1:15
a = zeros(2,10,15);
[m,n,r] = size(a)
a((no-1)*m*n + (d-1)*m + b) = c

Also for pre-allocation, you can use a much faster approach as listed in Undocumented MATLAB blog post on Preallocation performance with -

a(2,10,15) = 0;
like image 41
Divakar Avatar answered Sep 23 '26 18:09

Divakar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!