2017-02-21 10 views
1

У меня есть пользовательский ввод (i), который является нечетным числом. Я хочу создать массив i раз i. Поэтому я делаю следующее:Отраженный массив по диагонали

reflect = zeros(i, i); 

Теперь я хочу, чтобы произвести массив, который содержит числа, отражающие вдоль главной диагонали.

Если я = 5, это будет выглядеть следующим образом:

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

Я могу сделать это с помощью петли, но как это возможно, используя только Funcitons массив?

+0

функций '' diag' и triu' может быть полезным. – nibot

+0

@nibot Должны ли эти две функции быть достаточно или мне нужно что-нибудь еще? – carlosremove

+0

Какова логика этой матрицы? Я имею в виду, кроме того, что это '5x5', как вы решаете, какие элементы разместить где в этой матрице? –

ответ

2

Сначала создайте матрицу, в которой каждая строка переместится от 1 до i с строками i, затем установите верхнюю треугольную матрицу, включая диагональ 0. Если вы сделаете это, возьмите эту матрицу и поверните ее на 180 градусов и создайте другую матрица, которая имеет такой же размер, как матрицы и дополнительную матрица со всеми i + 1 вдоль диагоналями с нулями, установленная на все остальное и добавить все матрицы вместе:

i = 5; 
M = repmat(1 : i, i, 1); 
M(triu(M) ~= 0) = 0; 
O = M + (i + 1)*eye(i) + rot90(M, 2); 

Давайте пройдемся по каждой строке коды одного вовремя. Первая строка определяет, какая у вас размерная матрица, которая равна i x i. Затем мы создаем матрицу M, которая идет от 1 до i с i строками, и мы можем использовать repmat, чтобы помочь нам создать эту матрицу, переняв вектор от 1 до i и дублируя его i раз по вертикали. Затем мы используем функцию triu, где мы извлекаем верхнюю треугольную часть этой матрицы, включая диагональ, но мы будем устанавливать все элементы в верхней треугольной части на 0. Мы просто сравниваем верхнюю треугольную часть с тем, что отличное от нуля и используйте индексирование logical, чтобы помочь нам сделать это. Это устанавливает диагональ, а верхняя треугольная часть - 0, оставляя остальную неповрежденной.

Наконец, мы возьмем эту матрицу и добавить с единичной матрицей с eye масштабированного i + 1 и, наконец, чтобы завершить верхнюю половину, мы просто повернуть эту же матрицу на 180 градусов с помощью rot90, чтобы повернуть матрицу на 90 градусов, но как мы хотим поворот на 180 градусов, мы должны вращаться на 90 градусов в два раза, так что установить второй Parmeter rot90 до 2.

таким образом, мы получаем:

>> O 

O = 

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