【问题标题】:Map upper triangular matrix on vector skipping the diagonal in a different order在向量上映射上三角矩阵,以不同的顺序跳过对角线
【发布时间】:2016-10-18 23:56:00
【问题描述】:

我想将上三角矩阵转换为没有对角元素的向量。我确实注意到这个问题中给出的解决方案。 Map upper triangular matrix on vector skipping the diagonal.

但我的问题略有不同。 我想将一个 5*5 矩阵转换为向量,例如:

x; a12; a13; a14;  a15<br/>
x; x;   a23; a24; a25<br/>
x; x;  x;   a34;  a35<br/>
x;  x;  x;  x;  a45<br/

a12, a13, a14, a15, a23, a24, a25, a34, a35, a45

This means,<br/>
(i=1,j=2)->k=1; <br/>
(i=1,j=3)->k=2; <br/>
(i=1,j=4)->k=3; <br/>
(i=1,j=5)->k=4; <br/>
(i=2,j=3)->k=5; <br/>
(i=2,j=4)->k=6; <br/>
(i=2,j=5)->k=7; <br/>
(i=3,j=4)->k=8; <br/>
(i=3,j=5)->k=9; <br/>
(i=4,j=5)->k=10; <br/>

我怎样才能得到这个关系 f(i,j,N=5)=k? 我怎样才能得到反函数 (i,j)=g(k,N) ?

谢谢!

【问题讨论】:

    标签: algorithm matrix


    【解决方案1】:

    在将元素添加到向量时,您已经通过在嵌套 for 循环中为每个连续行使用递增起始索引来迭代矩阵。

    for (rowI = 0; rowI < 4; rowI++) {
        for (colI = rowI+1; colI < 5; colI++) {
            vector.add(matrix[rowI][colI]);
        }
    }
    
    • 外循环迭代行。
    • 内循环从外循环的索引 +1 开始,以便跟踪不包括对角线的上三角形的内边缘。
    • 一旦有了正确的索引,只需将其添加到列表中即可。
    • 外循环可以短暂停一排以节省循环,因为内循环开始高一个索引,因此停止条件将阻止它执行任何操作。

    或者,如果您只需要索引,那么一个方便的单行代码是:
    f(i,j,N) = (i-1)N + i(i-1)/2 + (j-i)

    【讨论】:

    • 谢谢。但我想要的是两种关系
    • f(i,j,N=5)=k and (i,j)=f(k,N)
    • 上面的嵌套结构可以回答同样的问题。只需用 k++ 替换 vector.add 并从 0 开始 k。由于嵌套循环仅遍历上三角形中的有效位置,因此 rowI = i 和 colI = j 时的停止点将包含 K 的正确值。虽然因为你不需要 k 中矩阵的实际值,只需要向量中位置的索引,提出与 i、j 和 N 相关的单个表达式可能是一个更优雅的解决方案。我不是完全确定表达式 (i,j)=f(k,N) 的预期结果。
    • 为了单线:f(i,j,N) = (i-1)N - (i+1)(i+2)/2 + (j-i)。我还没有得到相反方向的答案。如果你想要推导,我可以打出来。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 2018-08-26
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多