【问题标题】:Storing for loop output as vector?将循环输出存储为向量?
【发布时间】:2017-05-18 15:50:35
【问题描述】:

我正在尝试将我的 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

【问题讨论】:

    标签: matlab loops for-loop vector


    【解决方案1】:
    x=rand(113,1);
    y=rand(113,1);
    x=sort(x, 'descend');
    v=[x,y];
    n_vect = [];
    b_vect = [];
    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))
    
                n_vect = [n_vect,n];
                b_vect = [b_vect,b];
    
            end 
    end
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        首先,您不需要if 行上的true。当你说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));
        

        【讨论】:

          【解决方案4】:

          注意使用:

          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 不会显示任何警告,因为我们已经预先分配了它。

          请注意,最好始终使用 ; 来终止行。以避免在屏幕上出现不必要的打印,这既烦人又耗时。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-26
            • 2022-07-21
            • 2021-04-23
            • 2018-05-23
            • 2018-10-20
            • 1970-01-01
            相关资源
            最近更新 更多