比方說我給一些指標像B = [10 23 32....];
設置特定的行和列,除了零MATLAB中的對角線元素
現在可以說我有一個矩陣答:我想要做的是對每個指標的B讓說我,我想把A的第i行和第i列設置爲0,除了對角線元素A(i,i)(它保持不變)。
我可以通過循環做到這一點。但我想要一些基於某種矩陣乘法的矩陣乘法,這比循環更快。
任何想法傢伙?
比方說我給一些指標像B = [10 23 32....];
設置特定的行和列,除了零MATLAB中的對角線元素
現在可以說我有一個矩陣答:我想要做的是對每個指標的B讓說我,我想把A的第i行和第i列設置爲0,除了對角線元素A(i,i)(它保持不變)。
我可以通過循環做到這一點。但我想要一些基於某種矩陣乘法的矩陣乘法,這比循環更快。
任何想法傢伙?
假設,
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);
您可以將對角線元素臨時存儲在其他位置,將其索引到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中應該是昂貴的,我們在這段代碼中幾乎沒有函數調用,所以我希望它足夠快。
+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);
我不認爲用'bsxfun'將整個第i行和cols設置爲零。 – Divakar 2014-09-26 11:37:19
@Divakar你是對的。我會更正或刪除 – 2014-09-26 11:56:19
@Divakar更正。謝謝!像往常一樣非常有用 – 2014-09-26 12:00:02
沒有任何這裏提供的解決方案,爲你工作? – Divakar 2014-09-29 09:15:19