Процедура создания симметричной матрицы из заданного вектора в C - PullRequest
0 голосов
/ 22 сентября 2018

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

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. Как расширитьэто для любого заданного вектора длины?

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

Спасибо

1 Ответ

0 голосов
/ 22 сентября 2018

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

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

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

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

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

#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)];
    }
...