フィルターのクリア

Advanced logical matrix indexing

5 ビュー (過去 30 日間)
Krzysztof
Krzysztof 2012 年 10 月 11 日
Is it possible to use one line of code to achieve the following
given an NxN matrix A construct an N-1xN matrix B where each column _n in B eliminates the _nth element from the _n column in A
e.g.
A = [1 1 1;2 2 2;3 3 3] gives B = [2 1 1;3 3 2]
I can do this in a for-loop, but given MATLAB is really bad at handling these I was hoping there is a faster solution
Thanks,
~K

採用された回答

James Tursa
James Tursa 2012 年 10 月 11 日
Another variation of Matt J's approach:
B = A(:);
B(1:(N+1):(N*N)) = [];
B = reshape(B,N-1,N);
  2 件のコメント
Matt J
Matt J 2012 年 10 月 11 日
Interestingly, there's no need for B=A(:). It works just as well with B=A.
James Tursa
James Tursa 2012 年 10 月 11 日
I noticed that too, but the result is a 1D vector so you still need the reshape at the end.

サインインしてコメントする。

その他の回答 (2 件)

Matt Fig
Matt Fig 2012 年 10 月 11 日
編集済み: Matt Fig 2012 年 10 月 11 日
Given this array:
A = [1 1 1;2 2 2;3 3 3] % Must be n-by-n
% Remove the ith element of each ith column.
B = reshape(A(~eye(size(A))),size(A,1)-1,size(A,1))
.
.
.
EDIT
One could write a nifty little function to do this:
function A = removediag(A)
% Removes the diagonal elements of a square matrix.
% Author: Matt Fig
S = size(A);
if S(1)~=S(2)
error('REMOVEDIAG is only for square arrays');
end
A = reshape(A(~diag(true(1,S(1)))),S(1)-1,S(1));
  5 件のコメント
Matt Fig
Matt Fig 2012 年 10 月 11 日
I see. It is still sparse, but the space saving is ruined. True enough.
Matt Fig
Matt Fig 2012 年 10 月 11 日
編集済み: Matt Fig 2012 年 10 月 11 日
One could avoid the intermediate double (eye(size(A))) by using:
B = reshape(A(~diag(true(1,size(A,1)))),size(A,1)-1,size(A,1))
In fact this is 40% faster than my original solution for very large arrays.

サインインしてコメントする。


Matt J
Matt J 2012 年 10 月 11 日
編集済み: Matt J 2012 年 10 月 11 日
I don't think there's a 1-line solution (without creating your own mfile function), but you don't need loops:
B=A;
B(logical(speye(N)))=[];
B=reshape(B,N-1,N);

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by