2016-10-08 35 views
0

我收到代碼初始化向量A1大量使用一個沒有for循環的小向量?

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 

上面的代碼工作,但它是不是最佳的(這是很長,我需要重寫它時,向量的長度,n,改變了)。在我的任務中,A1的長度是偶數,通常位於範圍6<=n<=16。但是我需要初始化矢量A1巨大的倍數,k<=10^6。 我想重寫代碼。我的代碼如下。

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 

問題。是否可以重寫代碼而無需for循環?當矢量的長度n大大少於初始化數k時是否有意義?

回答

2

這是一個矢量形式:

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].' 

:我改變KK從1000000轉換爲2,因爲C的行數爲2,不能用數字比2。因此,這更多地被編入索引如果C的行數將是1000000,則會出現問題