2016-10-08 2 views
0

Ich habe den Code zur Initialisierung des Vektors A1 erhalten.Große Anzahl von Intilization ein kleiner Vektor ohne For-Schleife?

Sc=[75 80 85]; 
Sp=[60 65 70]; 
C=[10 20 30 40 50 60; 
    11 21 31 41 51 61]; 
% KK=1000000; 
% for k=1:KK 

k=1; 
    A1=[]; 
    A1=[-C(k,1)+max(60-Sc(1),0) -C(k,2)+max(60-Sc(2),0) -C(k,3)+max(60-Sc(3),0) 
     -C(k,4)+max(Sp(1)-60,0) -C(k,5)+max(Sp(2)-60,0) -C(k,6)+max(Sp(3)-60,0)]; 
%end; %KK 

Der obige Code ist Arbeit, aber es ist nicht optimal (es ist sehr lang und ich brauche es neu schreiben, wenn Länge des Vektors, n, geändert wird). In meiner Aufgabe ist die Länge A1 gerade und liegt typischerweise im Bereich 6<=n<=16. Aber ich muss Vektor A1 die riesige Anzahl mal initialisieren, k<=10^6. Ich möchte Code neu schreiben. Mein Code ist unten.

n= size(C,2); 
M=60; 
%KK=1000000; 
% for k=1:KK 
k=1; 

    AU=[];AD=[]; 
    for i=1:n 
    if i<=n/2 
    AU=[AU, -C(k,i)+max(M-Sc(i),0)]; 
    else 
    AD=[AD, -C(k,i)+max(Sp(i-n/2)-M,0)]; 
    end %if 
    end % i 
    A1=[AU; AD] 
% end; % KK 

Frage. Ist es möglich, den Code ohne For-Schleife umzuschreiben? Ist es sinnvoll, wenn die Vektorlänge n wesentlich kleiner ist als die Anzahl der Initialisierungen, k?

Antwort

2

Dies ist eine vektorisierte Form:

Sc=[75 80 85]; 
Sp=[60 65 70]; 
C=[10 20 30 40 50 60; 
    11 21 31 41 51 61]; 
kk=2;%1000000; 
n= 6; 
M=60; 
[K , I] = meshgrid(1:kk,1:n); 
Idx = sub2ind([kk,n], K, I); 
condition = I <= n/2; 

AU = -C(Idx(condition)) + max(M-Sc(I(condition)),0).'; 
AD = -C(Idx(~condition)) + max(Sp(I(~condition) - n/2)-M,0).'; 
A1 = [AU AD].' 

note: Ich kk 1000000-2 geändert, weil Anzahl der Zeilen von C 2 und nicht mit Zahlen, die größer als 2 ist also dieser Make indiziert werden kann Sinn, wenn die Anzahl der Zeilen von C wäre 1000000

Verwandte Themen