Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to efficiently compare elements in two vectors in MATLAB without using loops?

Say I have a matrix A whose first column contains item IDs with repetition and second column contains their weights.

A= [1   40
    3   33
    2   12
    4   22
    2   10
    3   6
    1   15
    6   29
    4   10
    1   2
    5   18
    5   11
    2   8
    6   25
    1   14
    2   11
    4   28
    3   38
    5   35
    3   9];

I now want to find the difference of each instance of A and its associated minimum weight. For that, I make a matrix B with its first column containing the unique IDs from column 1 of A, and its column 2 containing the associated minimum weight found from column 2 of A.

B=[1    2
   2    8
   3    6
   4    10
   5    11
   6    25];

Then, I want to store in column 3 of A the difference of each entry and its associated minimum weight.

A= [1   40  38
    3   33  27
    2   12  4
    4   22  12
    2   10  2
    3   6   0
    1   15  13
    6   29  4
    4   10  0
    1   2   0
    5   18  7
    5   11  0
    2   8   0
    6   25  0
    1   14  12
    2   11  3
    4   28  18
    3   38  32
    5   35  24
    3   9   3];

This is the code I wrote to do this:

for i=1:size(A,1)
    A(i,3) = A(i,1) - B(B(:,1)==A(i,2),2);
end

But this code takes a long time to execute as it needs to loop through B every time it loops through A. That is, it has a complexity of size(A) x size(B). Is there a better way to do this without using loops, that would execute faster?

like image 266
Kristada673 Avatar asked Dec 28 '25 07:12

Kristada673


1 Answers

You can use accumarray to first compute the minimum value in the second column of A for each unique value in the first column of A. We can then index into the result using the first column of A and compare to the second column of A to create the third column.

% Compute the mins
min_per_group = accumarray(A(:,1), A(:,2), [], @min);

% Compute the difference between the second column and the minima
A(:,3) = A(:,2) - min_per_group(A(:,1));
like image 194
Suever Avatar answered Dec 30 '25 22:12

Suever



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!