除了matlab中的对角元素外,设置特定的行和列零

时间:2014-09-25 23:34:13

标签: matlab

假设我给了一些像B = [10 23 32....];

这样的索引

现在让我说我有一个矩阵A.我想要做的是从B的每个索引让我说,我想将A的第i行和第i列设置为0,除了对角元素A(i,i) )(它保持不变)。

我可以通过循环来做到这一点。但我想要一些基于某种矩阵乘法的方法,它比循环更快。

任何想法的人?

4 个答案:

答案 0 :(得分:2)

你可以暂时将对角线元素存储在其他地方,使用B索引到A中,将相应的行和列设置为零,最后插入对角线元素 -

%// rows in A
rows = size(A,1);

%// Store the diagonal elements temporarily somewhere else
tmp_diagA = A(1:rows+1:end);

%// Set the ith rows and cols (obtained from B) to zero
A(B,:)=0;
A(:,B)=0;

%// Plug back in the diagonal elements in place
A(1:rows+1:end) = tmp_diagA;

在MATLAB中函数调用应该是昂贵的,并且我们在这段代码中几乎没有函数调用,所以我希望它足够快。

答案 1 :(得分:1)

您有一个选择:

创建对角元素的线性索引:

[I, J]=size(A);
idx=sub2ind([I,J], B, B);

将水平线和垂直线设置为0并替换对角线元素:

NewA=A;
NewA(B, :)=zeros(numel(B),J);
NewA(:, B)=zeros(I,numel(B));
NewA(idx)=A(idx);

答案 2 :(得分:1)

对于方A

b = zeros(size(A,1),1);
b(B) = B;
A = A.*bsxfun(@eq, b, b.')

对于一般A

b1 = zeros(size(A,1),1);
b1(B) = B;
b2 = zeros(1,size(A,2));
b2(B) = B;
A = A.*bsxfun(@eq, b1, b2);

答案 3 :(得分:0)

假设,

B=[10 23 32 12 15 18 20]
M=true(6)
M(B)=false  %making the indexed elements false
M=or(M,diag(true(size(M,1),1)))  %keep the diagonal elements one

% creating a matrix which has zero in ith row and ith column and diagonal has ones
M1=and(bsxfun(@or,bsxfun(@and,repmat(min(M,[],2),1,size(M,2)),min(M,[],1)),diag(true(size(M,1),1))),M)  

%Now just multiply M1 with your matrix A, and you are done.
newA=A.*M1

你可以将上面两行合并为一行,但我更喜欢它们在可读性方面不相交。