【问题标题】:Set the particular row and column zeros except the diagonal elements in matlab在matlab中设置除对角线元素外的特定行和列零
【发布时间】:2014-09-26 19:59:36
【问题描述】:

假设我得到了一些索引,例如B = [10 23 32....];

现在假设我有一个矩阵 A。我想要对 B 中的每个索引假设 i,我想将 A 的第 i 行和第 i 列设置为 0,但对角线元素 A(i,i )(它保持不变)。

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

各位有什么想法吗?

【问题讨论】:

  • 这里提供的任何解决方案对您有用吗?

标签: matlab


【解决方案1】:

您可以将对角线元素临时存储在其他地方,用 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 中应该很昂贵,而我们在这段代码中几乎没有函数调用,所以我希望它足够快。

【讨论】:

    【解决方案2】:

    你有一个选择是:

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

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

    【讨论】:

    • 觉得结尾应该是A(idx)
    • 这也应该很快。
    【解决方案3】:

    对于正方形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);
    

    【讨论】:

    • 我认为bsxfun 不会将整个第 i 行和列设置为零。
    • @Divakar 已更正。谢谢!像往常一样非常有帮助
    • 现在工作!很好用的面膜。 +1
    【解决方案4】:

    假设,

    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
    

    您可以将以上两行合二为一,但为了便于阅读,我更喜欢它们不相交。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2013-05-24
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      相关资源
      最近更新 更多