在 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;
我有一个这样大小的三维矩阵,大约
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;