Процедура создания симметричной матрицы из заданного вектора в C

Допустим, у меня есть вектор

x = [x0, x1, x2, x3] = [0, 2, 3, 1]. 

Я хочу создать симметричную матрицу из x. Т.е. симметричная матрица, у которой x в качестве первой строки и первого столбца, с x0 в качестве диагонали. Другими словами, мне нужна такая матрица X:

X = [0 2 3 1] = [x0 x1 x2 x3]
    [2 0 1 3]   [x1 x0 x3 x2]
    [3 1 0 2]   [x2 x3 x0 x1]
    [1 3 2 0]   [x3 x2 x1 x0]

Вопрос:

  1. Как я могу сделать это в C?
  2. Как я могу расширить это для любого заданного вектора длины?

Информатика — не моя область, поэтому все мои попытки до сих пор довольно смехотворны и включают цикл за циклом. Я упускаю что-то очевидное?

Спасибо


person The Dude    schedule 21.09.2018    source источник
comment
@ЕвгенийШ. Для диагоналей это не так.   -  person The Dude    schedule 22.09.2018
comment
Ой. Похоже, я неправильно прочитал вопрос. Хотя каждая строка - это просто поворот вектора.   -  person Eugene Sh.    schedule 22.09.2018
comment
@ЕвгенийШ. Это не относится к 1-му и второму ряду.   -  person The Dude    schedule 22.09.2018


Ответы (1)


Хитрость заключается в том, что индекс в массиве input является суммой индексов в массиве output. Например,

output[0][3] = output[1][2] = output[2][1] = output[3][0] = input[3] 

Однако с этим есть две проблемы:

Сначала главная диагональ (сверху/слева вниз/справа) всегда является первым элементом входного массива. Это можно обработать как частный случай, проверив, равны ли выходные индексы.

Затем возникает проблема, что делать, когда сумма выходных индексов превышает максимально допустимый входной индекс. В этом случае индекс во входном массиве вычисляется путем вычитания, как показано в приведенном ниже коде.

#define SIZE 4

int input[SIZE] = {0,1,2,3};
int output[SIZE][SIZE];

for (int row = 0; row < SIZE; row++)
    for (int col = 0; col < SIZE; col++)
    {
        if (row == col)                        // special case for the main diagonal
            output[row][col] = input[0];
        else if (row + col < SIZE)             // normal case for small indexes
            output[row][col] = input[row+col];
        else                                   // special case for large indexes
            output[row][col] = input[2*(SIZE-1) - (row + col)];
    }
person user3386109    schedule 21.09.2018