Конвертировать большой xyz-файл в сеточные данные (Matlab) - PullRequest
1 голос
/ 21 октября 2019

У меня есть большой файл XYZ (300276x3, этот файл включает координаты x и y (не широта / долгота, а полярная стереография) и угол места z), и мне интересно, можно ли преобразовать его в набор данных с сеткой(матрица nxm). Файл xyz можно загрузить с:

https://wetransfer.com/downloads/4ae4ce51072dceef93486314d161509920191021213532/48e4ee68c17269bd6f7a72c1384b3c9a20191021213532/60b04d

и импортировать в Matlab с помощью:

AIS_SEC = importdata('AIS_SEC.xyz');

Я пытался:

X= XYZ(:,1);
Y= XYZ(:,2);
Z= XYZ(:,3);
xr = sort(unique(X));
yr = sort(unique(Y));
gRho = zeros(length(yr),length(xr));
gRho = griddata(X,Y,Z,xr,yr')
imagesc(gRho)

Requested 300276x300276 (671.8GB) array exceeds maximum array size preference. Creation of arrays
greater than this limit may take a long time and cause MATLAB to become unresponsive. See array size
limit or preference panel for more information.

Я попытался:

% Get coordinate vectors 
    x = unique(XYZ(:,1)) ;
    y = unique(XYZ(:,2)) ;
    % dimensions of the data
    nx = length(x) ; 
    ny = length(y) ;
    % Frame matrix of grid 
    D = reshape(XYZ(:,3),[ny,nx]) ;
    % flip  matrix to adjust for plot
    H = flipud(H) ;
    % Transpose the matrix 
    H = H' ;  % Check if is required
    surf(x,y,H) ;

Error using reshape
To RESHAPE the number of elements must not change.

Теперь я могу нанести файл nx3 с помощью scatter3 (см. Изображение)

scatter3(XYZ(:,1),XYZ(:,2),XYZ(:,3),2,XYZ(:,3)) ;
colorbar

Но я бы хотел сделать это с imagesc. Следовательно, я хотел бы преобразовать файл nx3 в матрицу nxm (в растровом / сеточном формате), а в качестве дополнительного я хотел бы использовать его как файл геотипов для использования в QGIS.

enter image description here

Спасибо!

1 Ответ

0 голосов
/ 22 октября 2019

Вы были почти там ... Глядя на полученное сообщение о размере массива, кажется вероятным, что результат unique(X) приведет к 300276 уникальным значениям, возможно, из-за некоторых шумных данных.

Таким образом, вместо использования griddata с этими большими векторами X и Y вы можете определить несколько новых в нужном домене:

% make some sample data
N = 1000;
xv = linspace(-10,10,N);
yv = linspace(-10,10,N);
[XV,YV] = meshgrid(xv,yv);
ZV = XV.^2 + YV.^2;

% make into long vectors:
X = XV(:);
Y = YV(:);
Z = ZV(:);

% make x and y vector to interpolate z
N = 50; % size of new grid
xv = linspace(min(X), max(X), N); 
yv = linspace(min(Y), max(Y), N);
[XV,YV] = meshgrid(xv,yv);

% use griddata to find right Z for each x,y pair
ZV_grid = griddata(X,Y,Z,XV,YV);

% look at result
figure(); 
subplot(211)
imagesc(ZV);
subplot(212);
imagesc(ZV_grid)

enter image description here

...