【问题标题】:Routine For Creating A Symmetric Matrix From A Given Vector In C从 C 中的给定向量创建对称矩阵的例程
【发布时间】:2019-02-26 07:30:42
【问题描述】:

假设我有向量

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. 如何针对给定的任何长度向量扩展它?

计算机科学不是我的领域,所以到目前为止我的所有尝试都非常可笑,并且涉及循环。我错过了什么明显的东西吗?

谢谢

【问题讨论】:

  • @EugeneSh。这不是对角线的情况。
  • 哦。看来我误读了这个问题。虽然每一行只是向量的旋转。
  • @EugeneSh。第 1 行和第 2 行的情况并非如此。

标签: c algorithm matrix matrix-indexing symmetric


【解决方案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)];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多