【问题标题】:How to store submatrix in array如何将子矩阵存储在数组中
【发布时间】:2017-06-09 11:56:36
【问题描述】:

我有一个方阵B,我想提取它的子矩阵,它具有连续的行号和从 1 到 k 的列,其中 k 每个自然数不超过 n(我的矩阵的大小)。它还需要有非零主对角线条目。

此外,我想将子矩阵存储为数组形式,(下一步是检查它们的行列式是否为正,但我不会将其包含在这个问题中。这是我构建的代码:

for i = 1:n
    for j = 1:n-i+1
        submat2{i,j} = B([j:j+i-1],[1:i]);
        for k = 1:i
            maindiag{i,j,k} = prod((submat2{i,j}(i,i) ~= 0));
        end
        matmaindiag = []
        for l = 1:size(maindiag(i,j,:),3)
            matmaindiag = [matmaindiag cell2mat(maindiag(i,j,l))]

            if prod(matmaindiag ~= 0)
                boundsub{end+1} =  submat2{i,j};
            end
        end
    end
end

有没有更好的方法来做到这一点?

例如,如果我有:

B =

 6     7     8     9   
11    12    13    14   
 0    17    18    19   
 0     0    23    24 

那么我要提取的子矩阵是:

B([1],[1]), B([1],[2]), B([1,2],[1,2]), B([2,3],[1 ,2]), B([1,2,3],[1,2,3]), B([2,3,4],[1,2,3]) 和 B 本身

因为他们:

  1. B 列中的条目组成,从 1 到 k(子矩阵本身的大小)连续编号,并且

    1. 从B的连续编号的行

    2. 没有任何零值对角线条目

感谢您的帮助和想法:)

【问题讨论】:

  • 您能否添加一个B 的示例,您希望在这种情况下得到什么结果?
  • 我做到了,感谢您的反馈
  • 你说行号和列号必须都是1:k,但是你还想提取B([2,3],[1,2])。应该只有其中一个行/列是 1:k,还是这个条目有误?
  • 列从1开始连续编号,行也连续编号,但不一定从1开始

标签: arrays matlab matrix


【解决方案1】:

我想出了这个

n = size(B,1)
for i = 1:n
    for j = 1:n-i+1
    submat{i,j} = B([j:j+i-1],[1:i]);

     end
end
bousub = []
for i = 1:n
    for j = 1:n-i+1
     dia = diag(submat{i,j});
        if (prod(dia) ~= 0)    
        bousub{end+1} =  submat{i,j};

        end
    end
end

【讨论】:

    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 2021-03-19
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多