代码之家  ›  专栏  ›  技术社区  ›  Rick T

更改编号排序/编号顺序

  •  4
  • Rick T  · 技术社区  · 7 年前

    我有一个数组/数字序列 a=[1,2,3,4,5] 我正在努力 创建如下所示的数组/数字序列 a_new 下: 这个 表示数字应输入的订单/索引。

    a_new=...
    [1,2,3,4,5;
    2,1,2,3,4;
    3,3,1,2,3;
    4,4,4,1,2;
    5,5,5,5,1]
    

    我的想法在哪里使用 circshift 但很快就发现这是行不通的。

    a=[1,2,3,4,5];
    for n=1:5
      a_wrong(:,n)=circshift(a(:)',[0 n])(:)
    end
    

    生产

    a_wrong=[
        5   4   3   2   1
        1   5   4   3   2
        2   1   5   4   3
        3   2   1   5   4
        4   3   2   1   5]
    

    有什么想法吗?它不需要使用 环移 如果那不行的话。

    PS:我使用的是类似于Matlab的倍频程4.2

    3 回复  |  直到 7 年前
        1
  •  4
  •   gnovice    7 年前

    可能有很多不同的方法来生成这个矩阵。下面是一个使用函数的 repmat , toeplitz , tril ,及 triu :

    >> a_new = tril(repmat(a.', 1, numel(a)), -1)+triu(toeplitz(a))
    
    a_new =
    
         1     2     3     4     5
         2     1     2     3     4
         3     3     1     2     3
         4     4     4     1     2
         5     5     5     5     1
    
        2
  •  1
  •   SRT HellKitty    7 年前

    我不确定是否有内置函数,但这应该可以工作;

    a=[1,2,3,4,5];
    a_out = ones(length(a), length(a))
    for n=1:5
        a_out(n,:) = [n*ones(n-1),a(n:end)]
    end
    

    我的计算机上没有安装Octave或MATLAB,因此无法对其进行测试。这可能是个愚蠢的错误,请原谅我!

        3
  •  1
  •   rahnema1    7 年前

    你可以用 spdiags

    n = numel(a);    
    a_new = spdiags([repmat(flip(a).',1,n); repmat(a,n-1,1)],(1-n):0);