大量的intilization是一个没有for循环的小向量?

时间:2016-10-08 02:16:45

标签: matlab for-loop

我收到了初始化矢量A1的代码。

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-loop的情况下重写代码?当向量的长度n明显少于初始化的数量k时,它是否有意义?

1 个答案:

答案 0 :(得分: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的行数将是百万