Преобразовать верхнюю правую треугольную матрицу с учетом столбцов в C ++ - PullRequest
3 голосов
/ 04 августа 2011

У меня есть вектор, содержащий что-то вроде

{1,  2, 1,  4, 5, 1,  7, 8 ,9, 1 }

Таким образом, вектор представляет столбцы верхней правой матрицы

  1 2 4 7
  0 1 5 8
  0 0 1 9
  0 0 0 1 

Как я мог использовать вектор и получить от

{1,  2, 1,  4, 5, 1,  7, 8 ,9, 1 }

до

  1 2 4 7
  2 1 5 8
  4 5 1 9
  7 8 9 1 

как вектор

{ 1,2,4,7,
  2,1,5,8, 
  4,5,1,9,
  7,8,9,1 }

На самом деле после просмотра кода, решение:

for (int i = 0; i < cols; ++i)
    for (int j = 0; j <= i; ++j)
        v[cols * i + j] = v[cols * j + i] = w[k++];

1 Ответ

3 голосов
/ 04 августа 2011
int k=0;
for(int i = 0; i<4; ++i)
    for(int j = 0; j<=i; ++j)
        v[i][j]=v[j][i]=w[k++];

Предполагая, что исходный вектор равен w, dest - v.

Если это 1D, а не 2D, то [i][j] следует изменить на [4*i+j].

EDIT Это можно сделать «на месте», но это немного сложно. Чтобы не перезаписывать значения, которые вы еще не использовали, необходимо выполнить цикл в обратном направлении и сделать два прохода:

int k=10;
for(int i = 3; i >=0; --i)
    for(int j = i; j >= 0; --j)
        v[4*i+j]=v[--k];
for(int i = 0; i < 4; ++i)
    for(int j = 0; j < i; ++j)
        v[4*j+i]=v[4*i+j];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...