Discover MakerZone

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

use matrix, premutation?

Asked by kevin on 2 Apr 2012

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?

1 Comment

Walter Roberson 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.

kevin

Tags

Products

No products are associated with this question.

2 Answers

Answer by Thomas 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)

6 Comments

Thomas on 2 Apr 2012

doc find

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

Matt Tearle 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 on 2 Apr 2012

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

Thomas
Answer by Matt Tearle 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),:)

1 Comment

kevin on 2 Apr 2012

thx guy

Matt Tearle

Contact us