Как я могу создать/индексировать эту матрицу более эффективным способом?

Я написал код MATLAB, который работает нормально, но я хочу написать его более эффективным способом (я не хочу повторяться и хочу сделать его сухим).

Сначала я создаю матрицу из единиц (28 * 8), а затем хочу изменить некоторые ее элементы на минусовые.

Вот код:

a=ones(28,8);
for i=1:7
    j=1;
    a(i,j)=-1;
end
for i=8:13
    j=2;
    a(i,j)=-1;
end
for i=14:18
    j=3;
    a(i,j)=-1;
end
for i=19:22
    j=4;
    a(i,j)=-1;
end
for i=23:25
    j=5;
    a(i,j)=-1;
end
for i=26:27
    j=6;
    a(i,j)=-1;
end
for i=28:28
    j=7;
    a(i,j)=-1;
end

person ehsun    schedule 27.07.2018    source источник


Ответы (1)


Весь этот код можно сократить до одной строки:

a = repelem(ones(7, 8)-2.*eye(7, 8), 7:-1:1, 1);

Принцип работы. Приведенное выше решение сначала создает матрицу 7 на 8 единицы, а затем вычитает 7 на 8 идентификационная матрица (единицы на главной диагонали), умноженные на два. Это дает матрицу единиц с отрицательными единицами на главной диагонали. Затем он использует repelem для репликации каждой строки в количестве 7 для первый ряд, 6 для второго и так далее.

a = 

    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
    -1     1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1    -1     1     1     1     1     1     1
     1     1    -1     1     1     1     1     1
     1     1    -1     1     1     1     1     1
     1     1    -1     1     1     1     1     1
     1     1    -1     1     1     1     1     1
     1     1    -1     1     1     1     1     1
     1     1     1    -1     1     1     1     1
     1     1     1    -1     1     1     1     1
     1     1     1    -1     1     1     1     1
     1     1     1    -1     1     1     1     1
     1     1     1     1    -1     1     1     1
     1     1     1     1    -1     1     1     1
     1     1     1     1    -1     1     1     1
     1     1     1     1     1    -1     1     1
     1     1     1     1     1    -1     1     1
     1     1     1     1     1     1    -1     1
person gnovice    schedule 27.07.2018