Изменить номер сортировки / номер последовательности - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть массив / номер последовательности 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]

Есть мысли? Не нужно использовать circshift, если это не сработает.

PS: я использую Octave 4.2, которая похожа на Matlab

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Я не уверен насчет встроенной функции, но она должна работать;

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 на моем компьютере, поэтому я не могу проверить это.Это может быть глупая ошибка, прости меня за это!

0 голосов
/ 14 ноября 2018

Вы можете использовать spdiags для генерации матрицы:

n = numel(a);    
a_new = spdiags([repmat(flip(a).',1,n); repmat(a,n-1,1)],(1-n):0);
0 голосов
/ 13 ноября 2018

Вероятно, существует довольно много разных способов генерации этой матрицы.Вот один из них, использующий функции 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
...