如何将Z高度矩阵转换为笛卡尔坐标?

时间:2018-11-30 10:16:52

标签: octave

我已经在Octave中运行了FEMM仿真,结果得到了一个具有以下格式的相当大的矩阵:

resultMatrix =  0 90 120
                0 80 110
               10 80 100

在正常的笛卡尔系统中,看起来像这样

result = [1, 1, 0;
          2, 1, 90;
          3, 1, 120;
          1, 2, 0;
          ...]

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可能之前已经在计算xy坐标,因此您应该避免使用它们,这样就不必立即重新计算它们。不过,这是您的答案:

octave:1> results = [0 90 120; 0 80 110; 10 80 100];
octave:2> col1 = repmat ([1; 2; 3], [3 1]); # repeat matrix
octave:3> col2 = ([1; 1; 1] .* [1 2 3])(:); # automatic broadcasting
octave:4> coords = [col1 col2 results.'(:)]
coords =

     1     1     0
     2     1    90
     3     1   120
     1     2     0
     2     2    80
     3     2   110
     1     3    10
     2     3    80
     3     3   100

答案 1 :(得分:2)

我将提供一个替代答案,我怀疑这是您需要的而不是您要的。有效地将您的输出安排在一个网格中,并且您想为每个元素分配坐标。大概是想这样做,以便以后可以沿着这些线绘制表面或其他物体。

以八度为单位的最直接方法是创建一个网格,例如

[Xindices, Yindices] = ndgrid( 1:size(resultMatrix,1) , 1:size(resultMatrix,2) );

然后,您可以像这样直接绘制表面:

surface( Xindices, Yindices, resultMatrix );

还请注意,如果您确实希望以您描述的格式输出,则只需将所有相关的n维数组重新排列为矢量,就可以从上述内容中轻松获得输出:

result = [ Xindices(:), Yindices(:), resultMatrix(:) ];