Сначала создайте матрицу, в которой каждая строка переместится от 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
функций '' diag' и triu' может быть полезным. – nibot
@nibot Должны ли эти две функции быть достаточно или мне нужно что-нибудь еще? – carlosremove
Какова логика этой матрицы? Я имею в виду, кроме того, что это '5x5', как вы решаете, какие элементы разместить где в этой матрице? –