【发布时间】:2018-09-05 08:07:34
【问题描述】:
我有一个名为 mat 的 3D 矩阵。每列可能包含也可能不包含可变数量的前导零。我需要用 NaN 替换它们。重要的是要认识到,在出现第一个非零元素之后,任何列中可能会出现更多的零。也就是说,仅仅索引矩阵中的所有零并用 NaN 替换它们不会导致正确的结果。
我确实有一个可行的解决方案。但是,它包含两个 for 循环。我想知道是否可以矢量化并摆脱循环。实际上,mat 可能非常大,例如 10000x15x10000。因此,我对执行速度相当敏感。
这是我的玩具示例:
% Create test matrix
mat = randi(100,20,5,2);
mat(1:5,1,1) = 0;
mat(1:7,2,1) = 0;
mat(1:3,4,1) = 0;
mat(1:10,5,1) = 0;
mat(1:2,1,2) = 0;
mat(1:3,3,2) = 0;
mat(1:7,4,2) = 0;
mat(1:4,5,2) = 0;
% Find first non-zero element in every column
[~, firstNonZero] = max( mat ~= 0 );
% Replace leading zeros with NaN
% How to vectorize this part???
[nRows, nCols, nPlanes] = size(mat);
for j = 1 : nPlanes
for i = 1 : nCols
mat(1:firstNonZero(1, i, j)-1, i, j) = NaN;
end
end
【问题讨论】:
标签: matlab for-loop vectorization