How to identify blocks in a diagonal block matrix?
8 ビュー (過去 30 日間)
古いコメントを表示
I have the following type of block diagonal matrix whose non-overlapping "blocks" I would like to indentify. These blocks may vary in size and may contain zeros.
M = [
1 1 1 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1 0 1 0 0
0 0 0 0 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 1 1 1 0 1
0 0 0 0 0 0 0 0 1 0 1 1
0 0 0 0 0 0 0 0 1 1 1 1]
For this specific example, there are 4 distinct blocks whose indices are:
1, 2, 3 (3x3 block)
4, 5, 6 (3x3 block)
7 (1x1 block)
8, 9, 10, 11, 12 (4x4 block)
2 件のコメント
Paul
2023 年 8 月 25 日
What's the rule for identifying a distinct block? For example, why isn't 7 - 12 considered a single 5 x 5 block?
採用された回答
Stephen23
2023 年 8 月 25 日
編集済み: Stephen23
2023 年 8 月 25 日
This is not very pretty, but it gets the job done. Note for simplicity it only handles square matrices and assumes square, non-overlapping blocks of data. Extending this approach to non-square matrices and blocks might be possible.
M = [1,1,1,0,0,0,0,0,0,0,0,0; 1,1,1,0,0,0,0,0,0,0,0,0; 1,1,1,0,0,0,0,0,0,0,0,0; 0,0,0,1,1,1,0,0,0,0,0,0; 0,0,0,1,1,1,0,0,0,0,0,0; 0,0,0,1,1,1,0,0,0,0,0,0; 0,0,0,0,0,0,1,0,0,0,0,0; 0,0,0,0,0,0,0,1,0,1,0,0; 0,0,0,0,0,0,0,0,1,1,1,1; 0,0,0,0,0,0,0,1,1,1,0,1; 0,0,0,0,0,0,0,0,1,0,1,1; 0,0,0,0,0,0,0,0,1,1,1,1];
char(M+'0') % just for compact display of the entire matrix
assert(isequal(diff(size(M)),0),'matrix must be square')
C = {};
B = 1; % block begin
E = B; % block end
R = size(M,1);
while B<R
while E<R && any(any(M(E+1:R,B:E)|M(B:E,E+1:R).'))
E = E+1;
end
C{end+1} = M(B:E,B:E); %#ok<SAGROW>
E = E+1;
B = E;
end
Checking:
C
C{:}
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Operating on Diagonal Matrices についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!