将具有特定格式的 2-D 矩阵重塑为 3-D 矩阵 (MATLAB)
Reshape 2-D matrix with a specific format into a 3-D matrix (MATLAB)
我有一个笛卡尔二维矩阵 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
分配给[=20中的Z坐标=],第一个索引比第二个快,第二个比第三个快。因此,当从输入文件中读取矩阵时,A
的大小为 [2962228 10]
(输入文件的最后一行仅包含两个 elements/columns)。
我想将此矩阵重塑为尺寸为 [nx ny nz] = [512 512 113]
的等效笛卡尔 3-D 矩阵 B(ix,iy,iz)
- 是否有有效的方法来执行此操作?此外,由于 fscanf()
每行包含 10 个元素,所以当 fscanf()
读取时,最后一行附加了 8 个额外的元素 - 如何在重塑时不包含这些值?
非常感谢!!
正如评论中所讨论的,以下作品:
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
我有一个笛卡尔二维矩阵 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
分配给[=20中的Z坐标=],第一个索引比第二个快,第二个比第三个快。因此,当从输入文件中读取矩阵时,A
的大小为 [2962228 10]
(输入文件的最后一行仅包含两个 elements/columns)。
我想将此矩阵重塑为尺寸为 [nx ny nz] = [512 512 113]
的等效笛卡尔 3-D 矩阵 B(ix,iy,iz)
- 是否有有效的方法来执行此操作?此外,由于 fscanf()
每行包含 10 个元素,所以当 fscanf()
读取时,最后一行附加了 8 个额外的元素 - 如何在重塑时不包含这些值?
非常感谢!!
正如评论中所讨论的,以下作品:
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