MATLAB Answers

use matrix, premutation?

Asked by kevin

kevin (view profile)

on 2 Apr 2012
Accepted Answer by Thomas

Thomas (view profile)

i use the command

c=[1,2,3,4,5] perms(c)

to generate all permutation of c. and there are 2 equation which use the

j=sin(0*c)+sin(72*c)+sin(144*c)+sin(216*c)+sin(288*c)

k=cos(0*c)+cos(72*c)+cos(144*c)+cos(216*c)+cos(288*c)

and Z=j+k

how can i find what permutation for minimum z? the permutation must be the same for both j and k at the same time ie

j=sin(0*1)+sin(72*2)+sin(144*3)+sin(216*4)+sin(288*5)

k=cos(0*1)+cos(72*2)+cos(144*3)+cos(216*4)+cos(288*5)

i actually wrote the euqation wrong, sorry. but if

j=sin(0)*c+sin(72)*c+sin(144)*c+sin(216)*c+sin(288)*c

k=cos(0)*c+cos(72)*c+cos(144)*c+cos(216)*c+cos(288)*c

would that change anything?

Walter Roberson

Walter Roberson (view profile)

on 2 Apr 2012

Is your earlier question http://www.mathworks.com/matlabcentral/answers/34267-ordering-a-list-of-number considered answered? If so please Accept the answer; otherwise there is the appearance that this is an extension of the previous question that should be merged with it.

Products

No products are associated with this question.

2 Answers

Answer by Thomas

Thomas (view profile)

on 2 Apr 2012
Accepted answer

Another way:

```c=[1,2,3,4,5];
c=perms(c);
z=[];
j=[];
k=[];
```
```for i=1:length(c)
j(i)=sin(0*c(i,1))*sin(72*c(i,2))+sin(144*c(i,3))+sin(216*c(i,4))+sin(288*c(i,5));
k(i)=cos(0*c(i,1))*cos(72*c(i,2))+cos(144*c(i,3))+cos(216*c(i,4))+cos(288*c(i,5));
z(i)=j(i)+k(i);
end
```
```[p,q,r]=find(z==min(z));
```
```c(q,:)
minz=min(z)
```

Thomas

Thomas (view profile)

on 2 Apr 2012

doc find

[row,col,v] = find(X, ...)

Matt Tearle

Matt Tearle (view profile)

on 2 Apr 2012

Actually, z = []; doesn't preallocate space. It only makes an empty matrix. A better approach would be

n = length(c);
j = zeros(n,1);
k = zeros(n,1);
for i = 1:n
...

Also, calculating z inside the loop isn't necessary. Just do z = j+k; at the end. Natural vectorized expressions like that are one of the main strengths of MATLAB. (Of course, I'd say that you don't need loops at all...)

Thomas

Thomas (view profile)

on 2 Apr 2012

true, z need not be calculated inside the loop.. z=j+k+.. at the end should work just as well..

Matt Tearle (view profile)

Answer by Matt Tearle

Matt Tearle (view profile)

on 2 Apr 2012

I think this is what you're after:

```c=[1,2,3,4,5];
cp = perms(c);
% 0*c1, 72*c2, 144*c3, 216*c4, 288*c5
allc = bsxfun(@times,[0 72 144 216 288],cp);
sc = sin(allc);
cc = cos(allc);
```
```j = sc(:,1).*sc(:,2)+sum(sc(:,3:5),2);
k = cc(:,1) + cc(:,2).*cc(:,3) + cc(:,4) + cc(:,5);
z = j+k;
```
```% which row of the c permutations corresponds to the minimum value of z?
cp(z==min(z),:)
```

If j and k were all sums, this would be a bit neater, but I'm assuming the products there are deliberate.

EDIT TO ADD: From your comment in reply to Thomas, it seems like maybe these should all be sums (ie no products). In that case:

```c=[1,2,3,4,5];
cp = perms(c);
```
```% 0*c1, 72*c2, 144*c3, 216*c4, 288*c5
allc = bsxfun(@times,[0 72 144 216 288],cp);
% sin(0*c1) + sin(72*c2) + ...
j = sum(sin(allc),2);
k = sum(cos(allc),2);
z = j+k;
```
```% which row of the c permutations corresponds to the minimum value of z?
cp(z==min(z),:)
```

kevin

kevin (view profile)

on 2 Apr 2012

thx guy

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!