【问题标题】:Find the minimum absolute values along the third dimension in a 3D matrix and ensuring the sign is maintained在 3D 矩阵中沿第三维查找最小绝对值并确保符号保持不变
【发布时间】:2016-04-03 22:50:28
【问题描述】:

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

我为此编写的代码如下所示。

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 对应于受我之前提到的约束的矩阵。但是,这段代码听起来有点低效,因为我必须生成线性索引。有什么办法可以改善吗?

【问题讨论】:

  • min(abs(dist),[],3)?还是我错过了什么?
  • @Yuanhao 前两行代码已经在这样做了。找到最小值后,您是否也要尊重它们的原始符号?这就是您的代码为其余部分所做的工作。
  • 嗨 rayryeng,是的,我也需要这个标志。其余代码正在这样做,但正如我指出的那样效率不高,因为我总是需要在 sub 和 index 之间切换,这很烦人。
  • 这更有意义。让我制定一个答案。请稍等。
  • @LuisMendo 嗨 Luis,min(abs(dist),[],3) 仅给出最小绝对值。我需要具有最小绝对值的元素。所以,它可能是负面的。我的代码的前两行查找最小绝对值的索引,而其余代码则尝试查找符号。

标签: matlab matrix vectorization


【解决方案1】:

如果我正确解释了您的问题陈述,您希望找到 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));

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 2019-04-02
    • 1970-01-01
    • 2013-11-26
    • 2015-02-02
    • 2014-09-06
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多