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

问题描述:

比方说我给一些指标像B = [10 23 32....];设置特定的行和列,除了零MATLAB中的对角线元素

现在可以说我有一个矩阵答:我想要做的是对每个指标的B让说我,我想把A的第i行和第i列设置为0,除了对角线元素A(i,i)(它保持不变)。

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

任何想法家伙?

+0

没有任何这里提供的解决方案,为你工作? – Divakar 2014-09-29 09:15:19

假设,

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 

可以上面两行合并的一个,但我更喜欢他们脱节为了提高可读性。你有

一种选择是:

创建对角线元素的线性指标:

[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); 
+0

认为它应该是'A(idx)'结尾。 – Divakar 2014-09-26 04:29:39

+0

@Divakar编辑好,赶上! – 2014-09-26 11:59:05

+0

这应该也很快。 – Divakar 2014-09-26 13:46:34

您可以将对角线元素临时存储在其他位置,将其索引到A中用B将对应的行和列设置为零,并最终插回到对角线元素中 -

%// 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中应该是昂贵的,我们在这段代码中几乎没有函数调用,所以我希望它足够快。

+0

+1很有可能是最快的解决方案 – 2014-09-26 10:35:22

对于方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); 
+0

我不认为用'bsxfun'将整个第i行和cols设置为零。 – Divakar 2014-09-26 11:37:19

+0

@Divakar你是对的。我会更正或删除 – 2014-09-26 11:56:19

+0

@Divakar更正。谢谢!像往常一样非常有用 – 2014-09-26 12:00:02