代码之家  ›  专栏  ›  技术社区  ›  Shika93

Matlab元素位置

  •  1
  • Shika93  · 技术社区  · 7 年前

    我重写了几天前的问题,因为我把我想做的解释搞砸了。

    我有一个U/V坐标系,我在Matlab中使用 meshgrid 介于值(-0.1,0.1)之间。为了方便起见,我将此系统转换为 theta-phi coordinate system 。 这个转换给了我两个新的矩阵,我称之为A,B,这是一种。

    A=. . . . .   B= . . . . .
      . . . . .      . . . . .
      . . 0 . .      . . 0 0 0
      . . . . .      . . . . .
      . . . . .      . . . . .
    

    点以弧度表示值,但重要的一点是,A的中间有一个零,而B的一半中心行等于0,另一半的值以弧度表示。在我的例子中,这些矩阵是201x201大的。 这意味着以图形的方式,我应该有这种网格: enter image description here

    并且每个点在第三个矩阵中假定一个特定值。我需要做的是在特定点收集第三个矩阵的元素。例如,我需要点(在UV系统中)0.005,0.005,如下所示: enter image description here

    我想做的是使用这个函数

    function [out_matrix] = find_value(in_matrix,ref_matrix_H,ref_matrix_V,ref)
    
    ref_matrix= sqrt(ref_matrix_H.^2+ref_matrix_V.^2);
    [value,ii] = min(abs(ref_matrix(:)-ref));
    [row,col] = ind2sub(size(ref_matrix),ii);
    
    out_matrix=in_matrix(row,col);
    
    end
    

    哪里 ref_matrix_H ref_matrix_V 是两个矩阵A、B;ref是我需要的两点之一。我计算这个 ref_matrix 就像两个矩阵的交集一样,将这个新矩阵的每个元素与我的值进行比较,因此取对应元素的坐标,但此函数无法提取我期望的正确值。

    我想问题是当我计算 ref\U矩阵 因为我得到的结果是这样的:

    ref_matrix= 0.700 0.700 0.700 0.700 0.700
                0.650 0.650 0.650 0.650 0.650
                0.500 0.005 0.005 0.005 0.500
                0.450 0.002 0.002 0.002 0.450
                0.350 0.001 0.001 0.001 0.350
                0.450 0.002 0.002 0.002 0.450
                0.500 0.005 0.005 0.005 0.500
                0.650 0.650 0.650 0.650 0.650
                0.700 0.700 0.700 0.700 0.700
    

    其中,中心元素非常小(这是正确的),而其他元素则远离中心而增加。为了正常工作,矩阵应该有另一种形式

    ref_matrix= -0.700 -0.700 0.700 0.700 0.700
                -0.650 -0.650 0.650 0.650 0.650
                -0.500 -0.005 0.005 0.005 0.500
                -0.450 -0.002 0.002 0.002 0.450
                -0.350 -0.001 0.001 0.001 0.350
                -0.450 -0.002 0.002 0.002 0.450
                -0.500 -0.005 0.005 0.005 0.500
                -0.650 -0.650 0.650 0.650 0.650
                -0.700 -0.700 0.700 0.700 0.700
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Cris Luengo    7 年前

    假设 ref 是包含θ和φ值的两元素向量,对应于 ref_matrix_H ref_matrix_V ,我会这样做,以找到最接近这些坐标的整数索引:

    function out_value = find_value(in_matrix,ref_matrix_H,ref_matrix_V,ref)
       dist_matrix = sqrt((ref_matrix_H-ref(1)).^2 + (ref_matrix_V-ref(2)).^2);
       [~,index] = min(dist_matrix(:));
       out_value = in_matrix(index);
    end
    

    我在这里做的是更改您的代码,以便 dist_matrix 距离是否为英寸 H-V 空格至 参考 (请注意,该值始终为正值)。原始代码转换了 H-V型 将间距设置为到原点的距离,并找到一个距离值,该距离值与中的一个值最接近 参考

    最小索引可直接用于检索 in_matrix 使用线性索引。您可以使用 ind2sub 获取行和列索引,但在这种情况下不需要。


    编辑

    我需要点(在UV系统中)0.005,0.005

    如果要处理UV坐标,只需使用这些坐标即可。您已使用生成U和V矩阵 meshgrid ,这意味着这是一个很好的坐标系(两个方向上的坐标单调递增)。 interp2 将简化您的工作:

    % Your data (mock-up):
    [U,V] = meshgrid(linspace(-0.1,0.1,201),linspace(-0.1,0.1,201));
    in_matrix = randn(201,201);
    
    % Query a point (u,v):
    u = 0.005;
    v = 0.005;
    out = interp2(U,V,in_matrix,u,v);
    

    interp2 默认情况下使用线性插值。如果您真的需要从 in\u矩阵 最接近坐标的,使用最近邻插值:

    out = interp2(U,V,in_matrix,u,v,'nearest');