在C++中,给定列,将上三角矩阵转换为右上角形式

3

我有一个向量,其中包含类似以下内容:

{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 }

to

  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++];

你是想将条目复制到另一个容器中,还是需要随机访问? - quant_dev
要得到表示完整矩阵的向量,可以这样做: { 1,2,4,7, 2,1,5,8, 4,5,1,9, 7,8,9,1 } - edgarmtze
1个回答

3
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,目标向量为v。
如果应该是1D而不是2D,则应将[i][j]更改为[4*i+j]。
编辑 这可以“原地”完成,但有点棘手。为了不覆盖尚未使用的值,您必须向后循环并进行两次传递:
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];

有没有可能不使用两个向量,只使用源向量来完成这个操作呢?我猜不行,对吧? - edgarmtze
@cMinor 是的,但你需要调整源向量的大小。 - quant_dev
第二个解决方案很好,但是第一个方案,我得到了不同的结果,我按照您建议的更改了代码 for (int i = 1; i < cols; ++i) for (int j = 0; j <= i; ++j) v[4 * i + j] = v[4 * j + i] = w[k++]; 现在得到的结果是 0 1 1 1 1 2 4 7 1 4 5 8 1 7 8 9 而不是 1,2,4,7, 2,1,5,8, 4,5,1,9, 7,8,9,1 我做错了什么? - edgarmtze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接