在MATLAB中矢量化对三维矩阵切片的访问

时间:2016-03-20 08:22:20

标签: arrays matlab multidimensional-array vectorization slice

我有一个这些尺寸的三维矩阵,大约

A = rand(20, 1000, 20);

其中第一个和第三个维度的长度始终相同。我想将主对角切片中的元素归零。这就是我的意思

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

是否有矢量化或更快的方式来做到这一点?此代码大约运行100,000次,具有这些近似大小,但每次都不是完全相同的大小。

2 个答案:

答案 0 :(得分:2)

您可以对多个拖尾尺寸使用逻辑索引,同时对所有先前尺寸使用下标索引。这样您就可以轻松地在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,我不知道哪种解决方案更快。

答案 1 :(得分:1)

您可以使用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;