Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB中三维矩阵切片的矢量化访问_Arrays_Matlab_Multidimensional Array_Vectorization_Slice - Fatal编程技术网

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

Arrays MATLAB中三维矩阵切片的矢量化访问,arrays,matlab,multidimensional-array,vectorization,slice,Arrays,Matlab,Multidimensional Array,Vectorization,Slice,我有一个这样大小的三维矩阵,大约 A = rand(20, 1000, 20); 其中,第一个维度和第三个维度的长度始终相同。我想把主对角线切片中的元素归零。这就是我的意思 for ii = 1:size(A, 1) A(ii, :, ii) = 0; end 有没有矢量化或其他更快的方法来实现这一点?此代码大约运行100000次,每次的大小大致相同,但不完全相同。您可以对多表尾随维度使用逻辑索引,而对之前的所有维度单独使用下标索引。这样,您就可以轻松地在1000 20矩阵上执行操作

我有一个这样大小的三维矩阵,大约

A = rand(20, 1000, 20);
其中,第一个维度和第三个维度的长度始终相同。我想把主对角线切片中的元素归零。这就是我的意思

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

有没有矢量化或其他更快的方法来实现这一点?此代码大约运行100000次,每次的大小大致相同,但不完全相同。

您可以对多表尾随维度使用逻辑索引,而对之前的所有维度单独使用下标索引。这样,您就可以轻松地在1000 20矩阵上执行操作。要将此应用于矩阵,需要使用permute,这可能会很慢:

n=size(A,3)
A=permute(A,[2,1,3]);
A(:,diag(true(n,1)))=0;
A=permute(A,[2,1,3]);
如果可以在代码中永久交换A的维度并避免置换,这将导致最快的解决方案

或者,您可以使用repmat将索引扩展到

ix=repmat(reshape(diag(true(n,1)),n,1,n),[1,size(A,2),1])
A(ix)=0
对于相同大小的矩阵,您可以保留ix。目前无法访问MATLAB,我不知道哪种解决方案更快。

您可以使用它来建立要归零的元素的线性索引:

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

对于相同的矩阵尺寸,它是否运行了100k次?不完全如此。它在每个矩阵上运行约100次,有约1000个大小略有不同的矩阵。如果它们总是相同的大小,我会使用一个逻辑索引矩阵。我现在测试了这些方法。它们的速度要慢得多。我想这是矢量化并不优越的地方之一。这比Daniel的建议提供了更好的时间,但仍然比for-loop方法慢了一倍以上。有趣的是,即使所有
A
矩阵的大小都是常量,并且
bsxfun
只调用一次,情况仍然如此。执行
A(ind)=0100000次仍然比执行for循环100000次慢。我猜这是因为使用
A(ii,:,ii)
比使用
A(ind)
访问“随机”索引更快。如果这是真的,这是一个反对向量化代码的案例。但是因为我确实要求一个向量化的解决方案,我会接受这个答案作为最好的向量化解决方案。