How to get only linearly independent rows in a matrix or to remove linear dependency b/w rows in a matrix?

조회 수: 129 (최근 30일)
Say I have a matrix A = [1,1,1;1,2,3;4,4,4]; and I want only the linearly independent rows in my new matrix. The answer might be A_new = [1,1,1;1,2,3] or A_new = [1,2,3;4,4,4]
Since I have a very large matrix so I need to decompose the matrix into smaller linearly independent full rank matrix. Can someone please help?
  댓글 수: 2
sixwwwwww
sixwwwwww 2013년 12월 5일
what is meaning of linear independent in your case? A_new is linearly independent and A is not linearly dependent?
Puneet
Puneet 2013년 12월 5일
Linear dependence in the matrix makes it singular. In this case A, row 3 can be obtained 4*row 1. This means that the third row is redundant. Making the matrix singular(det(A)=0).I expect if there is some built in function in matlab that could give me A_new or someone has already written a code for such problem.

댓글을 달려면 로그인하십시오.

채택된 답변

Matt J
Matt J 2013년 12월 5일
This extracts linearly independent columns, but you can just pre-transpose the matrix to effectively work on the rows.
function [Xsub,idx]=licols(X,tol)
%Extract a linearly independent set of columns of a given matrix X
%
% [Xsub,idx]=licols(X)
%
%in:
%
% X: The given input matrix
% tol: A rank estimation tolerance. Default=1e-10
%
%out:
%
% Xsub: The extracted columns of X
% idx: The indices (into X) of the extracted columns
if ~nnz(X) %X has no non-zeros and hence no independent columns
Xsub=[]; idx=[];
return
end
if nargin<2, tol=1e-10; end
[Q, R, E] = qr(X,0);
if ~isvector(R)
diagr = abs(diag(R));
else
diagr = R(1);
end
%Rank estimation
r = find(diagr >= tol*diagr(1), 1, 'last'); %rank estimation
idx=sort(E(1:r));
Xsub=X(:,idx);
  댓글 수: 21
Matt J
Matt J 2020년 9월 21일
편집: Matt J 2020년 9월 21일
MICHAEL MONT-ETON's comment moved here.
Matt J.:
Thanks for the code. I'd like to provide a reference for your work in my upcoming paper that would benefit from removal of dependent equations in the system I am studying.
Please indicate how you would like that to read.
Very Respectfully,
Mike Mont-Eton

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Wayne King
Wayne King 2013년 12월 5일
편집: Wayne King 2013년 12월 5일
A = [1,1,1;1,2,3;4,4,4];
[R,basiccol] = rref(A);
B = A(:,basiccol);
The columns of B are a basis for the range of A. B has the same rank as A.
  댓글 수: 3
Matt J
Matt J 2013년 12월 5일
편집: Matt J 2013년 12월 5일
I have been warned not to trust RREF for this kind of thing. That was my reason for coding the QR-based method in my Answer.
Wayne King
Wayne King 2013년 12월 5일
As Matt advises below just transpose to work on rows.
B = A';
[R,basiccol] = rref(B);
B = B(:,basiccol)'

댓글을 달려면 로그인하십시오.


Lem
Lem 2015년 11월 27일
Hello,
I want to ask: instead of rank estimation, can we not just use the minpoly function, get the largest non-zero degree (r) from there and use r instead?
  댓글 수: 1
Matt J
Matt J 2015년 11월 27일
편집: Matt J 2015년 11월 27일
There's no way to avoid estimating rank. minpoly sounds like an alternative way to do so, but requires the Symbolic Toolbox. It also appears to be a lot slower than a QR approach, even for rather small matrices:
>> A=rand(10);
>> tic;minpoly(A);toc
Elapsed time is 0.875673 seconds.
>> tic;qr(A);toc
Elapsed time is 0.000063 seconds.

댓글을 달려면 로그인하십시오.


Dave Stanley
Dave Stanley 2017년 8월 24일
I wrote a few functions to handle this. They do basically the same as Matt J's function above, with some added bells and whistles. (Namely, it includes an option for ignoring columns that are shifted by a constant; for example, if col2 = 10 - col1. It also returns indices to clusters of originally linearly dependent columns ). Again, you'd have to add a transpose to operate on rows instead of columns. Hope it's useful to someone.
On your example above:
A = [1,1,1;1,2,3;4,4,4]'
[Abasis, Abasisi, Asub]= getLinearIndependent(A)
Result:
Input:
A =
1 1 4
1 2 4
1 3 4
Output:
Abasis =
1 1
1 2
1 3
Abasisi =
1 2
Asub =
1×2 cell array
[1,3] [2]
Here, Asub{1} contains the indices of all columns linearly dependent with the first basis vector, and Asub{2} contains that for the second.

Dominique Joubert
Dominique Joubert 2018년 11월 9일
svd , and looking at the number of non-zero singular values
  댓글 수: 8
Bruno Luong
Bruno Luong 2018년 11월 9일
편집: Bruno Luong 2018년 11월 9일
"If for example the values in that column were [0.4 0 0.2]"
But it's not the case. So you can't conclude anything in the above example.
If you want to convince, write down your algorithm to detect independent columns using SVD, then we can speak.
Puneet
Puneet 2018년 11월 9일
The algorithm written above by Matt works pretty good. I have tested that algorithm for quite a large matrix (1M+x1M+). However, I tried the svd route too when I posted this question, as said above I was not able to get results I am looking for.
Thanks, Puneet

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Linear Algebra에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by