簡體   English   中英

在MATLAB中矢量化對三維矩陣切片的訪問

[英]Vectorizing access to a slice of a three-dimensional matrix in MATLAB

我有一個大約這些尺寸的三維矩陣

A = rand(20, 1000, 20);

第一維和第三維的長度始終相同。 我想將主對角切片中的元素歸零。 這就是我的意思

for ii = 1:size(A, 1)
    A(ii, :, ii) = 0;
end

是否有矢量化或更快的方式來做到這一點? 此代碼運行大約100,000次,具有這些近似大小,但每次都不是完全相同的大小。

您可以對多個拖尾維度使用邏輯索引,同時對所有先前維度單獨使用下標索引。 這樣您就可以輕松地在1000 20 20矩陣上進行操作。 要將其應用於矩陣,需要進行置換,這可能很慢:

n=size(A,3)
A=permute(A,[2,1,3]);
A(:,diag(true(n,1)))=0;
A=permute(A,[2,1,3]);

如果可以在代碼中永久交換A的尺寸並避免置換,這將導致最快的解決方案。

或者,您可以使用repmat將索引擴展為A的維度

ix=repmat(reshape(diag(true(n,1)),n,1,n),[1,size(A,2),1])
A(ix)=0

對於相同大小的矩陣,您可以保留ix。 目前無法訪問MATLAB,我不知道哪種解決方案更快。

您可以使用bsxfun構建要歸零的元素的線性索引:

ind = bsxfun(@plus, (0:size(A,2)-1).'*size(A,1), 1:size(A,1)*size(A,2)+1:numel(A) );
A(ind) = 0;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM