我有一个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);
得到的dm
矩阵m X n
对应于我之前提到的约束条件的矩阵。但是,由于我必须生成线性索引,因此这段代码听起来有点低效。有没有办法改善这个?
答案 0 :(得分:4)
如果我正确解释您的问题陈述,您希望找到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));