2015-05-07 4 views
1

У меня есть 2D массив данных размером 7426x32 от 1deg цилиндрического среза. Он содержит: X, Y, Z и 29 переменных, таких как температура, плотность, давление и т. Д. В направлении X есть 79 узлов сетки, 2 - в Y и 47 в Z. Это одна «линия» объема ячейки в направлении Y. Данные записываются в этой манере:Interpolate 3d Data in Matlab

do Z = 1,47 
    do Y = 1,2 
    do X = 1,79 
     X,Y,Z, then the other 29 variables at each node 
    enddo 
    enddo 
enddo 

мне нужно интерполировать переменные, чтобы получить среднее значение переменной в каждом объеме клеток (что делает 3713 значения), умножать каждый к объему содержащейся в каждой ячейке , а затем суммировать все. Я понимаю, что могу использовать interp3 в Matlab, но я не уверен, как заставить функцию работать с данными, которые у меня есть.

«Gut инстинкт» говорит мне, что я должен иметь:

Vq = interp3(A(1:79,1),A(1:79,2),A(1:79,3),A(1:79,30)) 

Чтобы получить переменную в 30-м столбце. Но это не работает, и я не уверен, как это работает с тем, как мои данные упорядочены. Может ли кто-нибудь указать мне в правильном направлении?

спасибо!

+0

Что такое переменная 'A'? – Karlo

ответ

1

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

Вы можете восстановить это с помощью meshgrid:

[X,Y,Z] = meshgrid(1:79, 1:2, 1:47); 

каждый из X, Y и Z будет тогда 79x2x47 матрица, представляющая соответствующие координаты.

Таким образом, вы можете построить это прямо из того, что знаете входные данные, но более надежным и общим использовать reshape непосредственно на данных, особенно, поскольку вам придется выполнить ту же процедуру в 30-й колонке, чтобы поместить ее в в том же формате (вам все равно нужно знать, сколько координатных точек у вас есть, но это возможно для программного программирования для неизвестных наборов данных).

Дайте этому попытку:

X = reshape(A(:,1), 79, 2, 47); 
Y = reshape(A(:,2), 79, 2, 47); 
Z = reshape(A(:,3), 79, 2, 47); 
col30 = reshape(A(:,30), 79, 2, 47); 
Vq = interp3(X,Y,Z,col30,Xq,Yq,Zq); 

где XQ, YQ и Zq являются тестовые координаты, которые могут быть векторами или скаляры - они не должны быть в meshgrid формате. Имейте в виду, что вам нужно будет вызвать interp3 для каждой из ваших 29 переменных.

Это может не сработать сразу - координация заказа важна, и я не уверен, что правильно преобразовал описание переменных в форму Matlab (это индексирует по столбцам, поэтому иногда матрицы представляют данные YXZ, но в других случаях Правила XYZ применяются, и мне всегда нравится проверять данные, чтобы убедиться, что я их правильно понял). Если не проверять матрицы вручную, чтобы убедиться, что они упорядочены правильно и переупорядочить порядок аргументов 79, 2, 47 в reshape, если это необходимо.

+0

Большое спасибо, xenoclast. Это очень помогло! – user3654549

+0

Ваш код содержит несогласованные круглые скобки. – Karlo

+1

Спасибо @MWijnand, исправлено:) – xenoclast