Determine if Matrix can be permutated into Block Diagonal Matrix
$begingroup$
Is there a way to determine if by permutation of rows and columns a matrix can be transformed into a block-diagonal matrix (EDIT: with more than one block)? For example the following matrix
begin{bmatrix}
0 &0 &7 &0 &0 \
0 &0 &0 &0 &3 \
5 &0 &0 &1 &0\
0 &0 &2 &0 &0 \
0 &1 &0 &0 &0
end{bmatrix}
EDIT: set to 0 element in 2nd row that was =2.
By permuting first row with last row and first column with last column can be transformed into the following block-diagonal matrix.
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0
end{bmatrix}
Is there an algorithm to find out if it is possible and do it, or to determine the permutation matrix?
My problem is about representing points scored by players against each other in. I need to determine the relative strength of players by comparing their scores. Imagine the matrix is the score of a player against another player. Each row is a player, and each column is a player. The diagonal is empty, or zero. If nobody in a group of player has played against anybody in the other group of players, then I cannot rank one group against the other group, because I do not know their relative strength. So I'm trying to eventually decompose the matrix into several if they exist. In the example above they would be the two following ones
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &0 &0\
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0
end{bmatrix}
begin{bmatrix}
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0end{bmatrix}
diagonalization matrix-decomposition block-matrices
$endgroup$
add a comment |
$begingroup$
Is there a way to determine if by permutation of rows and columns a matrix can be transformed into a block-diagonal matrix (EDIT: with more than one block)? For example the following matrix
begin{bmatrix}
0 &0 &7 &0 &0 \
0 &0 &0 &0 &3 \
5 &0 &0 &1 &0\
0 &0 &2 &0 &0 \
0 &1 &0 &0 &0
end{bmatrix}
EDIT: set to 0 element in 2nd row that was =2.
By permuting first row with last row and first column with last column can be transformed into the following block-diagonal matrix.
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0
end{bmatrix}
Is there an algorithm to find out if it is possible and do it, or to determine the permutation matrix?
My problem is about representing points scored by players against each other in. I need to determine the relative strength of players by comparing their scores. Imagine the matrix is the score of a player against another player. Each row is a player, and each column is a player. The diagonal is empty, or zero. If nobody in a group of player has played against anybody in the other group of players, then I cannot rank one group against the other group, because I do not know their relative strength. So I'm trying to eventually decompose the matrix into several if they exist. In the example above they would be the two following ones
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &0 &0\
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0
end{bmatrix}
begin{bmatrix}
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0end{bmatrix}
diagonalization matrix-decomposition block-matrices
$endgroup$
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
1
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29
add a comment |
$begingroup$
Is there a way to determine if by permutation of rows and columns a matrix can be transformed into a block-diagonal matrix (EDIT: with more than one block)? For example the following matrix
begin{bmatrix}
0 &0 &7 &0 &0 \
0 &0 &0 &0 &3 \
5 &0 &0 &1 &0\
0 &0 &2 &0 &0 \
0 &1 &0 &0 &0
end{bmatrix}
EDIT: set to 0 element in 2nd row that was =2.
By permuting first row with last row and first column with last column can be transformed into the following block-diagonal matrix.
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0
end{bmatrix}
Is there an algorithm to find out if it is possible and do it, or to determine the permutation matrix?
My problem is about representing points scored by players against each other in. I need to determine the relative strength of players by comparing their scores. Imagine the matrix is the score of a player against another player. Each row is a player, and each column is a player. The diagonal is empty, or zero. If nobody in a group of player has played against anybody in the other group of players, then I cannot rank one group against the other group, because I do not know their relative strength. So I'm trying to eventually decompose the matrix into several if they exist. In the example above they would be the two following ones
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &0 &0\
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0
end{bmatrix}
begin{bmatrix}
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0end{bmatrix}
diagonalization matrix-decomposition block-matrices
$endgroup$
Is there a way to determine if by permutation of rows and columns a matrix can be transformed into a block-diagonal matrix (EDIT: with more than one block)? For example the following matrix
begin{bmatrix}
0 &0 &7 &0 &0 \
0 &0 &0 &0 &3 \
5 &0 &0 &1 &0\
0 &0 &2 &0 &0 \
0 &1 &0 &0 &0
end{bmatrix}
EDIT: set to 0 element in 2nd row that was =2.
By permuting first row with last row and first column with last column can be transformed into the following block-diagonal matrix.
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0
end{bmatrix}
Is there an algorithm to find out if it is possible and do it, or to determine the permutation matrix?
My problem is about representing points scored by players against each other in. I need to determine the relative strength of players by comparing their scores. Imagine the matrix is the score of a player against another player. Each row is a player, and each column is a player. The diagonal is empty, or zero. If nobody in a group of player has played against anybody in the other group of players, then I cannot rank one group against the other group, because I do not know their relative strength. So I'm trying to eventually decompose the matrix into several if they exist. In the example above they would be the two following ones
begin{bmatrix}
0 &1 &0 &0 &0 \
3 &0 &0 &0 &0 \
0 &0 &0 &0 &0\
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0
end{bmatrix}
begin{bmatrix}
0 &0 &0 &0 &0 \
0 &0 &0 &0 &0 \
0 &0 &0 &1 &5\
0 &0 &2 &0 &0 \
0 &0 &7 &0 &0end{bmatrix}
diagonalization matrix-decomposition block-matrices
diagonalization matrix-decomposition block-matrices
edited Dec 3 '18 at 3:13
gciriani
asked Dec 2 '18 at 21:59
gcirianigciriani
275
275
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
1
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29
add a comment |
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
1
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
1
1
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29
add a comment |
2 Answers
2
active
oldest
votes
$begingroup$
Problem
Given an $ntimes n$ matrix $A=(a_{ij})$, determine if it is possible to find a permutation matrix $P=(p_{ij})$ and square matrices $B$ and $C$ such that
$$
PAP^{intercal}=begin{pmatrix}B & 0\
0 & C
end{pmatrix}.
$$
Note: By grouping blocks, any matrix with three or more diagonal blocks can also be considered as a matrix with two diagonal blocks. For example,
$$
begin{pmatrix}B\
& C\
& & D
end{pmatrix}=begin{pmatrix}B\
& begin{pmatrix}C\
& D
end{pmatrix}
end{pmatrix}
$$
Solution
Let $G=(V,E)$ denote the undirected adjacency graph of $A$.
That is, $V$ and $E$ are defined by
$$
V={1,ldots,n}qquadtext{and}qquad E=left{ (i,j)in Vtimes Vcolon a_{ij}neq0text{ or }a_{ji}neq0right}.
$$
Now, our original problem is equivalent to determining whether $G$ is a graph with two or more disjoint components.
This is accomplished with a breadth-first search (or depth-first search) started at an arbitrary vertex, call it $v_{1}$.
Let $V^{prime}={v_{1},ldots,v_{k}}$ be the set of vertices visited by the search.
Then, the answer to our original problem is in the affirmitive if and only if $V^{prime}$ is a proper subset of $V$.
Example
Let's apply the algorithm to the matrix
$$
A=begin{pmatrix}0 & 0 & 7 & 0 & 0\
0 & 0 & 0 & 0 & 3\
5 & 0 & 0 & 1 & 0\
0 & 0 & 2 & 0 & 0\
0 & 1 & 0 & 0 & 0
end{pmatrix}.
$$
Let's run the search algorithm:
- Pick $v_{1}=1$ corresponding to the first row.
- The only nonzero entry in this row is $a_{v_{1}3} = 7$ so we pick $v_{2}=3$ as the next row to visit.
- The only nonzero entries in this row are $a_{v_{2}1} = 5$ and $a_{v_{2}4} = 1$. We have already visited the first row so we pick $v_{3}=4$ as the next row to visit.
- The only nonzero entry in this row is $a_{v_{3} 3} = 2$. We have already visited the third row and hence the search terminates.
The final vertex set is $V^{prime}={v_1,v_2,v_3}={1,3,4}$.
Next, make any permutation matrix that satisfies $p_{1v_{1}}=p_{2v_{2}}=p_{3v_{3}}=1$.
For example, we could take
$$
P=begin{pmatrix}1 & 0 & 0 & 0 & 0\
0 & 0 & 1 & 0 & 0\
0 & 0 & 0 & 1 & 0\
0 & 1 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 1
end{pmatrix}.
$$
You can check that $PAP^{intercal}$ has two diagonal blocks:
$$
PAP^{intercal}=begin{pmatrix}0 & 7 & 0 & 0 & 0\
5 & 0 & 1 & 0 & 0\
0 & 2 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 3\
0 & 0 & 0 & 1 & 0
end{pmatrix}.
$$
MATLAB implementation
The code below can be used to make the matrix P
described above from an input matrix A
. Just call perm_mat_to_make_block_diag(A)
.
Note: I don't have access to MATLAB and GNU Octave has not implemented the breadth-first search function bfsearch
, so I was unable to test the code below. If someone could test it for me, that would be great.
function P = perm_mat_to_make_block_diag(A)
% Make the undirected adjacency graph for A.
nonzero = A != 0;
adjacency = nonzero + nonzero';
G = graph(A);
% Perform breadth-first search.
v_1 = 1;
V_prime = bfsearch(G, v_1);
n = length(A);
if length(V_prime) == n
error('Input is not permutation-similar to a block-diagonal matrix.');
end
% Make the permutation matrix.
i = (1:n)';
V_prime_complement = setdiff(i, V_prime);
j = [V_prime; V_prime_complement];
P = sparse(i, j, ones(n, 1), n, n);
end
$endgroup$
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are calledV_prime
andV_prime_complement
in the MATLAB code).
$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
|
show 1 more comment
$begingroup$
The Dulmage-Mendelsohn decomposition (dmperm in MATLAB) can be used to do this for symmetric matrices (or just turn your non-symmetric matrix into a matrix of 0's and 1's with 1's replacing all non-zero entries in the original matrix.)
$endgroup$
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3023268%2fdetermine-if-matrix-can-be-permutated-into-block-diagonal-matrix%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
Problem
Given an $ntimes n$ matrix $A=(a_{ij})$, determine if it is possible to find a permutation matrix $P=(p_{ij})$ and square matrices $B$ and $C$ such that
$$
PAP^{intercal}=begin{pmatrix}B & 0\
0 & C
end{pmatrix}.
$$
Note: By grouping blocks, any matrix with three or more diagonal blocks can also be considered as a matrix with two diagonal blocks. For example,
$$
begin{pmatrix}B\
& C\
& & D
end{pmatrix}=begin{pmatrix}B\
& begin{pmatrix}C\
& D
end{pmatrix}
end{pmatrix}
$$
Solution
Let $G=(V,E)$ denote the undirected adjacency graph of $A$.
That is, $V$ and $E$ are defined by
$$
V={1,ldots,n}qquadtext{and}qquad E=left{ (i,j)in Vtimes Vcolon a_{ij}neq0text{ or }a_{ji}neq0right}.
$$
Now, our original problem is equivalent to determining whether $G$ is a graph with two or more disjoint components.
This is accomplished with a breadth-first search (or depth-first search) started at an arbitrary vertex, call it $v_{1}$.
Let $V^{prime}={v_{1},ldots,v_{k}}$ be the set of vertices visited by the search.
Then, the answer to our original problem is in the affirmitive if and only if $V^{prime}$ is a proper subset of $V$.
Example
Let's apply the algorithm to the matrix
$$
A=begin{pmatrix}0 & 0 & 7 & 0 & 0\
0 & 0 & 0 & 0 & 3\
5 & 0 & 0 & 1 & 0\
0 & 0 & 2 & 0 & 0\
0 & 1 & 0 & 0 & 0
end{pmatrix}.
$$
Let's run the search algorithm:
- Pick $v_{1}=1$ corresponding to the first row.
- The only nonzero entry in this row is $a_{v_{1}3} = 7$ so we pick $v_{2}=3$ as the next row to visit.
- The only nonzero entries in this row are $a_{v_{2}1} = 5$ and $a_{v_{2}4} = 1$. We have already visited the first row so we pick $v_{3}=4$ as the next row to visit.
- The only nonzero entry in this row is $a_{v_{3} 3} = 2$. We have already visited the third row and hence the search terminates.
The final vertex set is $V^{prime}={v_1,v_2,v_3}={1,3,4}$.
Next, make any permutation matrix that satisfies $p_{1v_{1}}=p_{2v_{2}}=p_{3v_{3}}=1$.
For example, we could take
$$
P=begin{pmatrix}1 & 0 & 0 & 0 & 0\
0 & 0 & 1 & 0 & 0\
0 & 0 & 0 & 1 & 0\
0 & 1 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 1
end{pmatrix}.
$$
You can check that $PAP^{intercal}$ has two diagonal blocks:
$$
PAP^{intercal}=begin{pmatrix}0 & 7 & 0 & 0 & 0\
5 & 0 & 1 & 0 & 0\
0 & 2 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 3\
0 & 0 & 0 & 1 & 0
end{pmatrix}.
$$
MATLAB implementation
The code below can be used to make the matrix P
described above from an input matrix A
. Just call perm_mat_to_make_block_diag(A)
.
Note: I don't have access to MATLAB and GNU Octave has not implemented the breadth-first search function bfsearch
, so I was unable to test the code below. If someone could test it for me, that would be great.
function P = perm_mat_to_make_block_diag(A)
% Make the undirected adjacency graph for A.
nonzero = A != 0;
adjacency = nonzero + nonzero';
G = graph(A);
% Perform breadth-first search.
v_1 = 1;
V_prime = bfsearch(G, v_1);
n = length(A);
if length(V_prime) == n
error('Input is not permutation-similar to a block-diagonal matrix.');
end
% Make the permutation matrix.
i = (1:n)';
V_prime_complement = setdiff(i, V_prime);
j = [V_prime; V_prime_complement];
P = sparse(i, j, ones(n, 1), n, n);
end
$endgroup$
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are calledV_prime
andV_prime_complement
in the MATLAB code).
$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
|
show 1 more comment
$begingroup$
Problem
Given an $ntimes n$ matrix $A=(a_{ij})$, determine if it is possible to find a permutation matrix $P=(p_{ij})$ and square matrices $B$ and $C$ such that
$$
PAP^{intercal}=begin{pmatrix}B & 0\
0 & C
end{pmatrix}.
$$
Note: By grouping blocks, any matrix with three or more diagonal blocks can also be considered as a matrix with two diagonal blocks. For example,
$$
begin{pmatrix}B\
& C\
& & D
end{pmatrix}=begin{pmatrix}B\
& begin{pmatrix}C\
& D
end{pmatrix}
end{pmatrix}
$$
Solution
Let $G=(V,E)$ denote the undirected adjacency graph of $A$.
That is, $V$ and $E$ are defined by
$$
V={1,ldots,n}qquadtext{and}qquad E=left{ (i,j)in Vtimes Vcolon a_{ij}neq0text{ or }a_{ji}neq0right}.
$$
Now, our original problem is equivalent to determining whether $G$ is a graph with two or more disjoint components.
This is accomplished with a breadth-first search (or depth-first search) started at an arbitrary vertex, call it $v_{1}$.
Let $V^{prime}={v_{1},ldots,v_{k}}$ be the set of vertices visited by the search.
Then, the answer to our original problem is in the affirmitive if and only if $V^{prime}$ is a proper subset of $V$.
Example
Let's apply the algorithm to the matrix
$$
A=begin{pmatrix}0 & 0 & 7 & 0 & 0\
0 & 0 & 0 & 0 & 3\
5 & 0 & 0 & 1 & 0\
0 & 0 & 2 & 0 & 0\
0 & 1 & 0 & 0 & 0
end{pmatrix}.
$$
Let's run the search algorithm:
- Pick $v_{1}=1$ corresponding to the first row.
- The only nonzero entry in this row is $a_{v_{1}3} = 7$ so we pick $v_{2}=3$ as the next row to visit.
- The only nonzero entries in this row are $a_{v_{2}1} = 5$ and $a_{v_{2}4} = 1$. We have already visited the first row so we pick $v_{3}=4$ as the next row to visit.
- The only nonzero entry in this row is $a_{v_{3} 3} = 2$. We have already visited the third row and hence the search terminates.
The final vertex set is $V^{prime}={v_1,v_2,v_3}={1,3,4}$.
Next, make any permutation matrix that satisfies $p_{1v_{1}}=p_{2v_{2}}=p_{3v_{3}}=1$.
For example, we could take
$$
P=begin{pmatrix}1 & 0 & 0 & 0 & 0\
0 & 0 & 1 & 0 & 0\
0 & 0 & 0 & 1 & 0\
0 & 1 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 1
end{pmatrix}.
$$
You can check that $PAP^{intercal}$ has two diagonal blocks:
$$
PAP^{intercal}=begin{pmatrix}0 & 7 & 0 & 0 & 0\
5 & 0 & 1 & 0 & 0\
0 & 2 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 3\
0 & 0 & 0 & 1 & 0
end{pmatrix}.
$$
MATLAB implementation
The code below can be used to make the matrix P
described above from an input matrix A
. Just call perm_mat_to_make_block_diag(A)
.
Note: I don't have access to MATLAB and GNU Octave has not implemented the breadth-first search function bfsearch
, so I was unable to test the code below. If someone could test it for me, that would be great.
function P = perm_mat_to_make_block_diag(A)
% Make the undirected adjacency graph for A.
nonzero = A != 0;
adjacency = nonzero + nonzero';
G = graph(A);
% Perform breadth-first search.
v_1 = 1;
V_prime = bfsearch(G, v_1);
n = length(A);
if length(V_prime) == n
error('Input is not permutation-similar to a block-diagonal matrix.');
end
% Make the permutation matrix.
i = (1:n)';
V_prime_complement = setdiff(i, V_prime);
j = [V_prime; V_prime_complement];
P = sparse(i, j, ones(n, 1), n, n);
end
$endgroup$
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are calledV_prime
andV_prime_complement
in the MATLAB code).
$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
|
show 1 more comment
$begingroup$
Problem
Given an $ntimes n$ matrix $A=(a_{ij})$, determine if it is possible to find a permutation matrix $P=(p_{ij})$ and square matrices $B$ and $C$ such that
$$
PAP^{intercal}=begin{pmatrix}B & 0\
0 & C
end{pmatrix}.
$$
Note: By grouping blocks, any matrix with three or more diagonal blocks can also be considered as a matrix with two diagonal blocks. For example,
$$
begin{pmatrix}B\
& C\
& & D
end{pmatrix}=begin{pmatrix}B\
& begin{pmatrix}C\
& D
end{pmatrix}
end{pmatrix}
$$
Solution
Let $G=(V,E)$ denote the undirected adjacency graph of $A$.
That is, $V$ and $E$ are defined by
$$
V={1,ldots,n}qquadtext{and}qquad E=left{ (i,j)in Vtimes Vcolon a_{ij}neq0text{ or }a_{ji}neq0right}.
$$
Now, our original problem is equivalent to determining whether $G$ is a graph with two or more disjoint components.
This is accomplished with a breadth-first search (or depth-first search) started at an arbitrary vertex, call it $v_{1}$.
Let $V^{prime}={v_{1},ldots,v_{k}}$ be the set of vertices visited by the search.
Then, the answer to our original problem is in the affirmitive if and only if $V^{prime}$ is a proper subset of $V$.
Example
Let's apply the algorithm to the matrix
$$
A=begin{pmatrix}0 & 0 & 7 & 0 & 0\
0 & 0 & 0 & 0 & 3\
5 & 0 & 0 & 1 & 0\
0 & 0 & 2 & 0 & 0\
0 & 1 & 0 & 0 & 0
end{pmatrix}.
$$
Let's run the search algorithm:
- Pick $v_{1}=1$ corresponding to the first row.
- The only nonzero entry in this row is $a_{v_{1}3} = 7$ so we pick $v_{2}=3$ as the next row to visit.
- The only nonzero entries in this row are $a_{v_{2}1} = 5$ and $a_{v_{2}4} = 1$. We have already visited the first row so we pick $v_{3}=4$ as the next row to visit.
- The only nonzero entry in this row is $a_{v_{3} 3} = 2$. We have already visited the third row and hence the search terminates.
The final vertex set is $V^{prime}={v_1,v_2,v_3}={1,3,4}$.
Next, make any permutation matrix that satisfies $p_{1v_{1}}=p_{2v_{2}}=p_{3v_{3}}=1$.
For example, we could take
$$
P=begin{pmatrix}1 & 0 & 0 & 0 & 0\
0 & 0 & 1 & 0 & 0\
0 & 0 & 0 & 1 & 0\
0 & 1 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 1
end{pmatrix}.
$$
You can check that $PAP^{intercal}$ has two diagonal blocks:
$$
PAP^{intercal}=begin{pmatrix}0 & 7 & 0 & 0 & 0\
5 & 0 & 1 & 0 & 0\
0 & 2 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 3\
0 & 0 & 0 & 1 & 0
end{pmatrix}.
$$
MATLAB implementation
The code below can be used to make the matrix P
described above from an input matrix A
. Just call perm_mat_to_make_block_diag(A)
.
Note: I don't have access to MATLAB and GNU Octave has not implemented the breadth-first search function bfsearch
, so I was unable to test the code below. If someone could test it for me, that would be great.
function P = perm_mat_to_make_block_diag(A)
% Make the undirected adjacency graph for A.
nonzero = A != 0;
adjacency = nonzero + nonzero';
G = graph(A);
% Perform breadth-first search.
v_1 = 1;
V_prime = bfsearch(G, v_1);
n = length(A);
if length(V_prime) == n
error('Input is not permutation-similar to a block-diagonal matrix.');
end
% Make the permutation matrix.
i = (1:n)';
V_prime_complement = setdiff(i, V_prime);
j = [V_prime; V_prime_complement];
P = sparse(i, j, ones(n, 1), n, n);
end
$endgroup$
Problem
Given an $ntimes n$ matrix $A=(a_{ij})$, determine if it is possible to find a permutation matrix $P=(p_{ij})$ and square matrices $B$ and $C$ such that
$$
PAP^{intercal}=begin{pmatrix}B & 0\
0 & C
end{pmatrix}.
$$
Note: By grouping blocks, any matrix with three or more diagonal blocks can also be considered as a matrix with two diagonal blocks. For example,
$$
begin{pmatrix}B\
& C\
& & D
end{pmatrix}=begin{pmatrix}B\
& begin{pmatrix}C\
& D
end{pmatrix}
end{pmatrix}
$$
Solution
Let $G=(V,E)$ denote the undirected adjacency graph of $A$.
That is, $V$ and $E$ are defined by
$$
V={1,ldots,n}qquadtext{and}qquad E=left{ (i,j)in Vtimes Vcolon a_{ij}neq0text{ or }a_{ji}neq0right}.
$$
Now, our original problem is equivalent to determining whether $G$ is a graph with two or more disjoint components.
This is accomplished with a breadth-first search (or depth-first search) started at an arbitrary vertex, call it $v_{1}$.
Let $V^{prime}={v_{1},ldots,v_{k}}$ be the set of vertices visited by the search.
Then, the answer to our original problem is in the affirmitive if and only if $V^{prime}$ is a proper subset of $V$.
Example
Let's apply the algorithm to the matrix
$$
A=begin{pmatrix}0 & 0 & 7 & 0 & 0\
0 & 0 & 0 & 0 & 3\
5 & 0 & 0 & 1 & 0\
0 & 0 & 2 & 0 & 0\
0 & 1 & 0 & 0 & 0
end{pmatrix}.
$$
Let's run the search algorithm:
- Pick $v_{1}=1$ corresponding to the first row.
- The only nonzero entry in this row is $a_{v_{1}3} = 7$ so we pick $v_{2}=3$ as the next row to visit.
- The only nonzero entries in this row are $a_{v_{2}1} = 5$ and $a_{v_{2}4} = 1$. We have already visited the first row so we pick $v_{3}=4$ as the next row to visit.
- The only nonzero entry in this row is $a_{v_{3} 3} = 2$. We have already visited the third row and hence the search terminates.
The final vertex set is $V^{prime}={v_1,v_2,v_3}={1,3,4}$.
Next, make any permutation matrix that satisfies $p_{1v_{1}}=p_{2v_{2}}=p_{3v_{3}}=1$.
For example, we could take
$$
P=begin{pmatrix}1 & 0 & 0 & 0 & 0\
0 & 0 & 1 & 0 & 0\
0 & 0 & 0 & 1 & 0\
0 & 1 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 1
end{pmatrix}.
$$
You can check that $PAP^{intercal}$ has two diagonal blocks:
$$
PAP^{intercal}=begin{pmatrix}0 & 7 & 0 & 0 & 0\
5 & 0 & 1 & 0 & 0\
0 & 2 & 0 & 0 & 0\
0 & 0 & 0 & 0 & 3\
0 & 0 & 0 & 1 & 0
end{pmatrix}.
$$
MATLAB implementation
The code below can be used to make the matrix P
described above from an input matrix A
. Just call perm_mat_to_make_block_diag(A)
.
Note: I don't have access to MATLAB and GNU Octave has not implemented the breadth-first search function bfsearch
, so I was unable to test the code below. If someone could test it for me, that would be great.
function P = perm_mat_to_make_block_diag(A)
% Make the undirected adjacency graph for A.
nonzero = A != 0;
adjacency = nonzero + nonzero';
G = graph(A);
% Perform breadth-first search.
v_1 = 1;
V_prime = bfsearch(G, v_1);
n = length(A);
if length(V_prime) == n
error('Input is not permutation-similar to a block-diagonal matrix.');
end
% Make the permutation matrix.
i = (1:n)';
V_prime_complement = setdiff(i, V_prime);
j = [V_prime; V_prime_complement];
P = sparse(i, j, ones(n, 1), n, n);
end
edited Dec 4 '18 at 1:48
answered Dec 3 '18 at 1:19
parsiadparsiad
17.8k32353
17.8k32353
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are calledV_prime
andV_prime_complement
in the MATLAB code).
$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
|
show 1 more comment
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are calledV_prime
andV_prime_complement
in the MATLAB code).
$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
Is there an easy way to implement this in Matlab or Octave?
$endgroup$
– gciriani
Dec 3 '18 at 2:54
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
do you know how to extract the blocks?
$endgroup$
– gciriani
Dec 3 '18 at 16:02
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are called
V_prime
and V_prime_complement
in the MATLAB code).$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
To your first question, I just added a MATLAB implementation. To your second question, the two blocks are given by the indices in $V^prime$ and $(V^prime)^{complement} equiv V setminus V^prime$ (these are called
V_prime
and V_prime_complement
in the MATLAB code).$endgroup$
– parsiad
Dec 4 '18 at 1:44
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
Unfortunately I do not have Matlab, and use only Octave, so I cannot test your code either. However, I found an easy implementation, inspired by Calvin-Lin @MISC {277075, TITLE = {Easiest way to determine all disconnected sets from a graph?}, AUTHOR = {Calvin Lin (math.stackexchange.com/users/54563/calvin-lin)}, HOWPUBLISHED = {Mathematics Stack Exchange}, NOTE = {URL:math.stackexchange.com/q/277075 (version: 2013-01-13)}, EPRINT = {math.stackexchange.com/q/277075}, URL = {math.stackexchange.com/q/277075} }
$endgroup$
– gciriani
Dec 4 '18 at 19:34
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
$begingroup$
...continued. If A is the connection matrix, then C=((A>0) + I)^n where n is the size of the matrix, transforms it in a matrix with all possible paths of length n, which are identical for connected nodes, and different for each disconnected graph. Then with the command [Y,i,j]=Unique(C, 'rows') I obtain the different connection blocks and their respective positions.
$endgroup$
– gciriani
Dec 4 '18 at 19:49
|
show 1 more comment
$begingroup$
The Dulmage-Mendelsohn decomposition (dmperm in MATLAB) can be used to do this for symmetric matrices (or just turn your non-symmetric matrix into a matrix of 0's and 1's with 1's replacing all non-zero entries in the original matrix.)
$endgroup$
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
add a comment |
$begingroup$
The Dulmage-Mendelsohn decomposition (dmperm in MATLAB) can be used to do this for symmetric matrices (or just turn your non-symmetric matrix into a matrix of 0's and 1's with 1's replacing all non-zero entries in the original matrix.)
$endgroup$
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
add a comment |
$begingroup$
The Dulmage-Mendelsohn decomposition (dmperm in MATLAB) can be used to do this for symmetric matrices (or just turn your non-symmetric matrix into a matrix of 0's and 1's with 1's replacing all non-zero entries in the original matrix.)
$endgroup$
The Dulmage-Mendelsohn decomposition (dmperm in MATLAB) can be used to do this for symmetric matrices (or just turn your non-symmetric matrix into a matrix of 0's and 1's with 1's replacing all non-zero entries in the original matrix.)
answered Dec 3 '18 at 3:58
Brian BorchersBrian Borchers
6,11111219
6,11111219
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
add a comment |
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
I tried dmperm, but it doesn't seem to perform what I'm trying to determine. According to Octave's help, dmperm is used for block triangular form, which is not what I'm trying to accomplish. What I need is to determine the disjoint components.
$endgroup$
– gciriani
Dec 3 '18 at 13:38
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
If your original matrix is symmetric, then p=dmperm(A), B=A(p,p) will put the matrix into block upper triangular form, but since the matrix is symmetric, that will also be block diagonal form. Try it.
$endgroup$
– Brian Borchers
Dec 3 '18 at 15:02
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
one of the elements of p turns out to be 0, and dmperm gives an error; my example [0 0 5 1 0; 0 0 0 0 3; 7 0 0 0 0; 2 0 0 0 0; 0 1 0 0 0]
$endgroup$
– gciriani
Dec 3 '18 at 16:42
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Your example matrix isn't symmetric.
$endgroup$
– Brian Borchers
Dec 3 '18 at 16:47
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
$begingroup$
Even with a symmetric matrix [0 0 1 1 0; 0 0 0 0 1; 1 0 0 0 0; 1 0 0 0 0; 0 1 0 0 0], dmperm gives [3, 5, 1, 0, 2] as a result.
$endgroup$
– gciriani
Dec 4 '18 at 14:56
add a comment |
Thanks for contributing an answer to Mathematics Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3023268%2fdetermine-if-matrix-can-be-permutated-into-block-diagonal-matrix%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Any matrix $A$ is already trivially block-diagonal in the sense that it can be written $[A]$. You might need to constrain your question further.
$endgroup$
– parsiad
Dec 2 '18 at 22:30
$begingroup$
@parsiad, I thought the example made it clear that I'm talking about more than one block. Otherwise suggest how I should clarify my question please.
$endgroup$
– gciriani
Dec 2 '18 at 22:47
$begingroup$
You could specify a minimum number of blocks or an exact number of blocks to make the problem nontrivial.
$endgroup$
– parsiad
Dec 2 '18 at 23:54
1
$begingroup$
@parsiad, I added in the first paragraph "more than one block". I hope that helps.
$endgroup$
– gciriani
Dec 3 '18 at 0:38
$begingroup$
BTW, your first example is incorrect (it is actually not permutation similar to a matrix with two block diagonals). I think you dropped one of the nonzero elements (namely, the number 2 appears twice before you permute and only once afterwards)
$endgroup$
– parsiad
Dec 3 '18 at 1:29