Как преобразовать матрицу Z-высоты в декартовы координаты? - PullRequest
0 голосов
/ 30 ноября 2018

Я запустил симуляцию FEMM в Octave, и в результате я получил довольно большую матрицу в следующем формате:

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 голосов
/ 02 декабря 2018

Я предоставлю альтернативный ответ, который, как я подозреваю, вам нужен, а не то, что вы спрашиваете.Фактически ваш вывод упорядочен в виде сетки, и вы хотите назначить координаты каждому элементу.Предположительно, вы хотите сделать это так, чтобы впоследствии вы могли нанести на поверхность или что-то подобное вдоль этих линий.

Самый простой способ приблизиться к этому в октаве - это создать сетку, например,

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

Это затем позволяет вам построить прямую поверхность следующим образом:

surface( Xindices, Yindices, resultMatrix );

Также обратите внимание, что если вы действительно хотите получить результат в описанном вами формате, вы можете легко получить его извыше также, просто переставляя все соответствующие n-мерные массивы как векторы:

result = [ Xindices(:), Yindices(:), resultMatrix(:) ];
0 голосов
/ 01 декабря 2018

Вероятно, вы раньше вычисляли координаты 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
...