【问题标题】:Matrix creation Octave / Matlab, loopless solution request矩阵创建 Octave / Matlab,无环解请求
【发布时间】:2012-05-02 18:14:53
【问题描述】:

我想创建一个矩阵

A = [0 0 0 0 1;
     0 0 0 1 1;
     0 0 0 1 1;
     0 0 0 1 1;
     0 0 1 1 1;
     0 1 1 1 1]

基于一个向量,该向量指示在每行的“1”之前应该有多少个“0”:

B = [4 3 3 3 2 1]

有没有无循环的方法来做到这一点?

【问题讨论】:

    标签: matlab matrix octave vectorization


    【解决方案1】:

    你没有在你的问题中提到应该如何定义数组的水平大小(个数)。

    对于预定义的宽度,您可以使用以下代码:

    width = 5;
    
    A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,width-x) ], B, 'UniformOutput', false)');
    

    如果您希望 A 具有最小宽度,但每行中仍然至少有一个 1:

    A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,max(B)+1-x) ], B, 'UniformOutput', false)');
    

    【讨论】:

      【解决方案2】:

      在没有循环的情况下实现这一点的更短的“老派”方法如下:

      A = repmat(B',1,max(B)+1)<repmat([1:max(B)+1],size(B,2),1)
      

      如果你想拥有最少数量的人

      min_ones=1; %or whatever
      A = repmat(B',1,max(B)+min_ones)<repmat([1:max(B)+min_ones],size(B,2),1)
      

      我不知道这与@nrz 的方法相比在速度方面如何(我现在手头只有 Octave),但对我来说它更直观,因为它只是比较 B 的 max(B) + min_ones * 列平铺:

      4  4  4  4  4
      3  3  3  3  3
      3  3  3  3  3
      3  3  3  3  3
      2  2  2  2  2
      1  1  1  1  1
      

      使用 [1 : max(B) + min_ones] 的行平铺

      1  2  3  4  5
      1  2  3  4  5
      1  2  3  4  5
      1  2  3  4  5
      1  2  3  4  5
      1  2  3  4  5
      

      生成:

      A =
      
        0  0  0  0  1
        0  0  0  1  1
        0  0  0  1  1
        0  0  0  1  1
        0  0  1  1  1
        0  1  1  1  1
      

      【讨论】:

      • 这比我的方法快大约 6-7 倍(至少在 R2011b 上)。在我的笔记本电脑上tic;for i=1:100000;A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,max(B)+1-x) ], B, 'UniformOutput', false)');end;toc 大约需要 35 秒,而 @rroowwllaanndd 的代码 min_ones = 1;tic;for i=1:100000;A = repmat(B',1,max(B)+min_ones)&lt;repmat([1:max(B)+min_ones],size(B,2),1);end;toc 只需要大约 5.3 秒。
      【解决方案3】:

      这只需要一行,而且似乎比以前基于repmatarrayfun的解决方案要快:

      %// Example data
      ncols = 5;
      B = [4 3 3 3 2 1];
      
      %// Generate A
      A = bsxfun(@gt, 1:ncols, B(:));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多