繁体   English   中英

在3D矩阵中找到沿三维的最小绝对值,并确保保持符号

[英]Find the minimum absolute values along the third dimension in a 3D matrix and ensuring the sign is maintained

我有一个m X n X k矩阵,我想为每个唯一的2D空间坐标找到在三维方向上具有最小绝对值的元素。 另一个限制是,一旦找到这些最小值,就必须保持这些值的符号(即,在获取绝对值之前)。

我为实现此目的而编写的代码如下所示。

tmp = abs(dist); %the size(dist)=[m,n,k]
[v,ind] = min(tmp,[],3); %find the index of minimal absolute value in the 3rd dimension
ind = reshape(ind,m*n,1);
[col,row]=meshgrid(1:n,1:m); row = reshape(row,m*n,1); col = reshape(col,m*n,1);     
ind2 = sub2ind(size(dist),row,col,ind); % row, col, ind are sub
dm = dist(ind2); %take the signed value from dist
dm = reshape(dm,m,n);

所得的矩阵dmm X n ,该矩阵对应于我前面已经提到的约束条件。 但是,由于我必须生成线性索引,因此此代码听起来效率低下。 有什么办法可以改善这一点?

如果我正确地解释了您的问题说明,则希望为3D矩阵中每个唯一的2D空间坐标沿三维方向找到最小绝对值。 您的代码的前两行已经完成了此操作。

但是,有一点需要注意的是,一旦找到这些最小值,就必须确保尊重这些值的原始符号(即在获取绝对值之前)。 这就是其余代码的目的。

如果要选择原始值,则别无选择,只能从原始矩阵生成正确的线性索引和样本。 但是,很多代码是多余的。 无需执行任何类型的重塑。

我们可以使用ndgrid生成正确的空间坐标以从3D矩阵中进行采样,然后使用代码中的ind来引用三维空间,从而简化您的方法。 之后,使用它来采样dist并完成您的代码:

%// From your code
[v,ind] = min(abs(dist),[],3); 

%// New code
[row,col] = ndgrid(1:size(dist,1), 1:size(dist,2));

%// Output
dm = dist(sub2ind(size(dist), row, col, ind));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM