将循环输出存储为向量?

时间:2017-05-18 15:50:35

标签: matlab loops for-loop vector

我正在尝试将n和b变量的输出存储为向量。我尝试过的解决方案在向量中产生了不必要的零值。有什么建议?

x=rand(113,1);
y=rand(113,1);
x=sort(x, 'descend');
v=[x,y];
for i=2:113
  m=max(v(1:i-1,2));
  if v(i,2) > m == true 
    n=(v(i-1,2))
    b=(v(i-1,1))
  end 
end

4 个答案:

答案 0 :(得分:0)

x=rand(113,1);
y=rand(113,1);
x=sort(x, 'descend');
v=[x,y];
n=[];b=[];
for i=2:113
   m=max(v(1:i-1,2));
   if v(i,2) > m
        n(end+1)=v(i-1,2)
        b(end+1)=v(i-1,1)
   end 
end

答案 1 :(得分:0)

$ImportedCsv | Group-Object -Property Email | ForEach-Object {
    $ToAddress = $_.Name
    $Body = $_.Group | Select-Object * -Exclude 'Email' | ConvertTo-Html -Head $HtmlFormat -Body $BodyFormat
    Send-MailMessage -From $FromAddress -To $ToAddress -Subject $Subject -BodyAsHtml "$Body" -Priority High -SmtpServer $SMTPServer
}

答案 2 :(得分:0)

首先,您不需要true行上的if。当您说if v>m时,它意味着if v is bigger than m,因此无需拥有== true

您可以按如下方式优化代码:

x=rand(113,1);
y=rand(113,1);
x=sort(x, 'descend');
v=[x,y];
N = [];
B = [];
for ii=2:113
    if v(ii,2) > max(v(1:ii-1,2))
        N = [N v(ii-1,2)];
        B = [B v(ii-1,1)];
    end
end

但请记住,如果向量很大,您应该考虑预先分配两个向量。 如果在循环开始之前您不知道数组的大小,请预先分配它,然后在必要时在循环完成后将其缩小。

在这种情况下,您可以使用NaN预分配然后删除它们:

x=rand(113,1);
y=rand(113,1);
x=sort(x, 'descend');
v=[x,y];
N = nan(size(x));
B = N;
for ii=2:113
    if v(ii,2) > max(v(1:ii-1,2))
        N(ii,1) = v(ii-1,2);
        B(ii,1) = v(ii-1,1);
    end
end
N = N(~isnan(N));
B = B(~isnan(B));

答案 3 :(得分:0)

请注意使用:

a = [] ;
for i = 1:n
   a = [a i] ;
end

当您循环到更高的数字时,上述方法将花费很长时间。另请注意,MATLAB在数组 a 下显示红线。因此,最好的方法是预先分配矩阵。现在,问题是,当我不知道尺寸时,我如何预先分配矩阵/数组。请记住,我们在MATLAB中,它有很多选项。我们很幸运,在这种情况下我们知道一个维度,即你的结果是一个数组,因此其中一个维度是1.我们可以在这种情况下预先分配结果。检查以下代码:

x=rand(113,1);
y=rand(113,1);
x=sort(x, 'descend');
v=[x,y];
count = 0 ;
n_vect = zeros(1,[]);
b_vect = zeros(1,[]);
for i=2:113
    m=max(v(1:i-1,2));
    if v(i,2) > m == true
        n=(v(i-1,2)) ;
        b=(v(i-1,1)) ;
        count = count+1 ;
        n_vect(count) = n ;
        b_vect(count) = b;

    end
end

现在MATLAB没有显示任何警告,因为我们预先分配了它。

请注意,最好始终使用;避免在屏幕上不必要的打印,这是令人讨厌和耗时的。