【问题标题】:Accessing elements in submatrix in big matrix matlab在大矩阵matlab中访问子矩阵中的元素
【发布时间】:2014-07-05 09:07:26
【问题描述】:

我有一个分为子矩阵的大矩阵。

clear all
clc

X  = [1 2 3; 4 5 6; 7 8 9];
B1 = zeros(3,9);
B2 = zeros(3,3);
m1 = diag([11 12 13]);
m2 = diag([14 15 16]);
m3 = diag([17 18 19]);
G = [ X B1; B2 m1 m2 m3]; 

结果是

G =

     1     2     3     0     0     0     0     0     0     0     0     0
     4     5     6     0     0     0     0     0     0     0     0     0
     7     8     9     0     0     0     0     0     0     0     0     0
     0     0     0    11     0     0    14     0     0    17     0     0
     0     0     0     0    12     0     0    15     0     0    18     0
     0     0     0     0     0    13     0     0    16     0     0    19

现在我的问题是如何访问子矩阵 (m1, m2, m3) 的对角元素,无论是从索引 i = 1 到 i = 3,还是访问特定的 m,例如 i = 2平方米?另一个问题是是否可以通过名称访问子矩阵作为大矩阵的索引?例如,G(m1(1,1))?我现在这不起作用,但我想说明我的观点。

【问题讨论】:

    标签: matlab matrix sparse-matrix


    【解决方案1】:

    访问子矩阵的对角线

    要得到子矩阵的对角线,你必须选择子矩阵,然后使用 diag 函数:

    diag(G(1:3,1:3))
    

    子矩阵的标签

    你可以这样定义一个标签:

    m1_s={[4:6],[4:6]}
    

    表示第 4 到 6 行,第 4 到 6 列。使用 G(m1_s{:}) 获取子矩阵。

    显然,您可以将这两种技术结合起来。比如得到子矩阵m1的对角线:

    diag(G(m1_s{:}))
    

    {:} 解释为here,它将元胞数组m1_s 转换为逗号分隔的列表。写G(m1_s{:})G(m1_s{1},m1_s{2})一样

    /更新:

    可以使用函数句柄实现更动态的标记方式:

    m_s=@(c)({[4:6],[1:3]+c*3})
    

    现在你可以使用了

    m1_s=m_s(1)
    G(m1_s)
    

    【讨论】:

    • 但是如果我增加 m,你的方法会很困难。我做的很简单。我确实创建了一个函数function index = m_index(i) for a = 1:i j = 4; k = 1; while (k < a) j = j + 3; k = k + 1; end end index = j; end 现在我正在根据 i 索引控制 ms。在 main() 中,G(4, m_index(i) ) G(5, m_index(i)+1) G(6, m_index(i)+2)
    • @CroCo:你是对的,有很多方法可以以更动态的方式定义它,但你的函数似乎有点过于复杂。函数不是总是返回(i+1)*3+1 吗?
    • (i+1)*3+1 是的,但这不能处理i=1 的第一种情况。在这种情况下,它应该返回4 而不是7
    • 我跟踪了输出,结果是1 4; 2 7; 3 10; 4 13。在这种情况下,我无需通过循环即可访问某些 m。该函数负责处理此循环。
    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2014-07-17
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多