## Quickly applying a function to all possible combinations of vectors

on 5 Jan 2013

### Matt J (view profile)

I have a function f that takes two vectors x and y and

` f(x,y) = Transpose(sin(x-y))*Z*sin(x-y)`

where Z is a diagonal positive definite matrix of appropriate size. Now, I have a matrix X where each column is a vector (so X1 = X(:,1), X2 = X(:,2), etc). I want to make a matrix K where K(1,1) = f(X1,X1), K(1,2) = f(X1,X2), etc.

I know i can do this with nested for loops but it runs very slow (X contains over 1000 points and K is calculated a few hundred times and it ends up taking about two hours). Now the code I'm basing it off of has similar functions and can do it in about 2 minutes. Anyone know how to quickly do this?

Eric

### Eric (view profile)

on 6 Jan 2013

I want it to for X with any number of rows

Matt J

### Matt J (view profile)

on 6 Jan 2013

Yes, but will the number of rows typically be much greater, much less, or comparable to the number of columns? It would affect the approach used.

You can't perform the computation for any number of rows that you want. At some point, you're going to face limits of computer memory.

Eric

### Eric (view profile)

on 6 Jan 2013

The number of rows will be significantly lower than the number of columns (i plan on using it for about 10 or so rows)

## Products

No products are associated with this question.

on 5 Jan 2013
Edited by Matt J

### Matt J (view profile)

on 5 Jan 2013

Using only 1 loop,

`    K=0;`
`    for i=1:size(X,1)`
```     xy=X(i,:);
K=K + sin(bsxfun(@minus,xy.',xy)).^2*Z(i,i);```
`    end`

Matt J

### Matt J (view profile)

on 6 Jan 2013

With what dimensions of X?

When I do it on my machine with size(X)=[2000, 2000], it completes in about 90 sec. If your data sizes are much bigger than that, you may have to face the fact that the computation time you're seeing is mainly dictated by data size and nothing more.

Matt J

### Matt J (view profile)

on 6 Jan 2013

The number of rows will be significantly lower than the number of columns (i plan on using it for about 10 or so rows)

When I run with size(X)=[10,2000], my proposed implementation finishes in less than 0.5 seconds. Even if you have a much poorer machine than me, there's no way it could still be taking 2 hours.

That's assuming of course that 2000 is a reasonable upper bound on the number of columns you're using. If it isn't, you might consider responding to my (third!!!) request for more full information on the size of X that you're benchmarking with.

Eric

### Eric (view profile)

on 6 Jan 2013

Had to make some adjustments for my code and i made a mistake in translation, works great now, thanks!

#### Join the 15-year community celebration.

Play games and win prizes!

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