Создание сетки из таблицы с 3 столбцами в Matlab

У меня есть таблица со значениями, извлеченными из CSV, из которого я хочу сделать контурный график. Давайте использовать эту таблицу в качестве примера

tdata.x = [1;2;1;2];
tdata.y = [3;3;4;4];
tdata.z = randn(4,1);
tdata=struct2table(tdata);
>> tdata
tdata =
  4×3 table
    x    y       z   
    _    _    _______
    1    3    0.53767
    2    3     1.8339
    1    4    -2.2588
    2    4    0.86217

Я хотел бы повернуть это так, чтобы я мог использовать его для построения контура, поэтому в принципе мне нужна матрица 2x2 z, где строки/столбцы задаются y и x соответственно, что-то в этом направлении:

 x 1        2
y                                                                           
3  0.53767  1.8339
4  -2.2588  0.86217

где первая строка — координаты x, первые столбцы — координаты y, а между ними — соответствующие значения z. То есть значение z, соответствующее (x,y)=(1,4), равно -2,2588.

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


person Morten Nissov    schedule 08.04.2021    source источник
comment
Обратите внимание, что контурные графики, если я не ошибаюсь, всегда подразумевают некоторую интерполяцию между точками в любой сетке, которую вы будете создавать.   -  person Matteo V    schedule 08.04.2021
comment
Упоминание о контурном графике, возможно, вводит в заблуждение, я просто хотел матрицы сетки X, Y и Z, которые затем можно было бы использовать для создания контуров. Я хотел, чтобы сами матрицы содержали только данные, потому что я имел в виду и другое использование. Я ничего не имею против интерполяции, необходимой для графика типа контур/прибой.   -  person Morten Nissov    schedule 08.04.2021


Ответы (2)


Вы можете использовать unstack, т.е.

t = unstack( tdata, {'z'}, {'x'} );

Что даст вам это:

введите здесь описание изображения

Обратите внимание, что все имена столбцов имеют префикс x, потому что имя столбца не может начинаться с цифры. Вы должны иметь возможность снова извлечь значения x, особенно если они всегда являются целыми числами, это не будет слишком сложно для любых операций, которые вы хотите отсюда...

person Wolfie    schedule 08.04.2021

Вот подход, который я бы использовал:

result = full(sparse(findgroups(tdata.y), findgroups(tdata.x), tdata.z));

Точно так же вы можете использовать третий вывод unique вместо findgroups или accumarray вместо sparse:

[~, ~, ux] = unique(tdata.x);
[~, ~, uy] = unique(tdata.y);
result = accumarray([uy ux], tdata.z);
person Luis Mendo    schedule 08.04.2021