Преобразование двумерной матрицы с заданным форматом c в трехмерную матрицу (MATLAB) - PullRequest
0 голосов
/ 17 июня 2020

У меня есть декартова двумерная матрица, A, которая содержит ячейки значений доз в трех измерениях (X, Y, Z);

  • Координата X: от 0,0 до 50,00 см , nx=512 ячейки (ширина 9,7656E-02 см)
  • Координата Y: от 0,0 до 50,00 см, ny=512 ячейки (ширина 9,7656E-02 см)
  • Координата Z: от От 0,0 до 27,12 см, nz=113 ячеек (ширина 2,4000E-01 см)

Таким образом, общее количество элементов в A равно nx*ny*nz=29622272. При чтении .dat-файла данные в матрице A сохраняются в следующем формате

A (1,1,1) A (2,1,1) A (3, 1,1) A (4,1,1) A (5,1,1) A (6,1,1) A (7,1,1) A (8,1,1) A (9,1, 1) A (10,1,1)

A (11,1,1) A (12,1,1) A (13,1,1) A (14,1,1) A ( 15,1,1) A (16,1,1) A (17,1,1) A (18,1,1) A (19,1,1) A (20,1,1)

A (503,1,1) A (504,1,1) A (505,1,1) A (506,1,1) A (507,1,1) A (508,1,1) A (509,1,1) A (510,1,1) A (511,1,1) A (512,1,1)

A (1,2 , 1) A (2,2,1) A (3,2,1) A (4,2,1) A (5,2,1) A (6,2,1) A (7,2,1 ) A (8,2,1) A (9,2,1) A (10,2,1)

A (11,2,1) A (12,2,1) A (13 , 2,1) A (14,2,1) A (15,2,1) A (16,2,1) A (17,2,1) A (18,2,1) A (19,2 , 1) A (20,2,1)

A (1,1,2) A (2,1,2) A (3 , 1,2) A (4,1,2) A (5,1,2) A (6,1,2) A (7,1,2) A (8,1,2) A (9,1 , 2) A (10,1,2)

A (511,512,113) A (512,512,113)

, где присвоен первый индекс ix координате X присваивается индекс iy координате Y и присваивается индекс iz ed к координате Z в A(ix,iy,iz), и первый индекс выполняется быстрее, чем второй, а второй - быстрее, чем третий. Таким образом, при чтении матрицы из входного файла A имеет размер [2962228 10] (последняя строка во входном файле содержит только два элемента / столбца).

Я хочу преобразовать эту матрицу в эквивалентную декартову 3-мерную матрицу B(ix,iy,iz) с размерами [nx ny nz] = [512 512 113] - есть ли эффективный способ сделать это? Кроме того, 8 дополнительных элементов добавляются в последнюю строку при чтении с помощью fscanf(), поскольку A содержит 10 элементов в строке - как мне не включить эти значения при изменении формы?

Заранее большое спасибо !!

1 Ответ

1 голос
/ 19 июня 2020

Как обсуждалось в комментариях, работает следующее:

B = A.'; % transpose to have the data in column-major order
B = B(1:end-8); % remove last values in linear order. Gives a column vector
result = reshape(B, [512 512 113]); % reshape to desired size
...