【问题标题】:How do I perform an index-based transform in MATLAB?如何在 MATLAB 中执行基于索引的转换?
【发布时间】:2016-05-20 03:35:11
【问题描述】:

假设我有一个矩阵M,其大小为1024。假设我使用 meshgrid 来获取以下 x 和 y 索引。

[x, y] = meshgrid(1:1024, 1:1024);

接下来,让我们对xy 应用一些函数(例如,目标是产生鱼眼或枕形效果)。

x_new = func1(x);
y_new = func2(y);

现在将这些矩阵用于转换后的xy 坐标x_newy_new,如何使用这些转换后的索引映射创建新矩阵N?换句话说,是否有更优雅的方式来执行以下操作?

for i = 1:1024
    for j = 1:1024
        N(i, j) = M(x_new(i, j), y_new(i, j));
    end
end

【问题讨论】:

    标签: matlab matrix transform


    【解决方案1】:

    尝试以下方法:

     N=reshape(diag(M(x_new,y_new)),[N,N])
    

    通过调用M(x_new,y_nex),您可以得到 N^2 乘 N^2 矩阵以及所有可能的索引组合。你只需要这个矩阵的主对角线。

    【讨论】:

    • 不幸的是,在我的情况下,这对于数组来说太大了。不过谢谢!
    【解决方案2】:

    与其将函数应用于行/列索引值,然后尝试使用它们重新索引到M,为什么不直接使用interp2 在您的新位置对M 进行采样?这允许您从func1func2 返回非整数值。

    [x, y] = meshgrid(1:1024, 1:1024);
    N = interp2(x, y, M, func1(x), func2(y));
    

    【讨论】:

      【解决方案3】:

      解决这个问题的正确方法是将 (i, j) 形式的下标索引转换为线性索引。此操作产生一个 1024x1024 矩阵,这是易于处理的。我们可以做到以下几点:

      linIndices = sub2ind(size(x_new), x_new, y_new));
      N = M(linIndices);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-16
        • 2019-10-30
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        相关资源
        最近更新 更多