0

我正在尝试创建一个大小为 1000x1000x1000 的 3D 数组,其中所有元素(对应于体素)为零,然后将 2000 到 2001 范围内的随机值而不是 0 分配给数组中的某些特定元素,最后将其存储为二进制文件。

名为“coord”的数组是我需要为它们分配 3D 数组中的随机值的点的 Nx3 矩阵坐标 (x,y,z)。))

我应该提到坐标矩阵的所有 x,y,z 值都是浮点数:0<=x<=1000 0<=y<=1000 0<=z<=1000

我的目标是以二进制格式(MATLAB 的默认二进制格式除外)导出 3D 矩阵,以便我可以将它与其他程序一起使用。这是我到目前为止所做的:

load coord;
a=coord(:,1);
b=coord(:,2);
c=coord(:,3);
d=rand(1000,1)*2000;
dd = 0:2:1000;
[xq,yq,zq] = meshgrid(dd,dd,dd);
vq = griddata3(a,b,c,d,xq,yq,zq,'nearest');
h=figure;
plot3(a,b,c,'ro')
%=========================================%
fid=fopen('data.bin','w');
fwrite(fid,vq,'single');
fclose(fid);

在上面的代码中,a、b 和 c 是每个点的坐标,d 是所需范围的相应强度值。虽然可以创建 3D 网格(使用 meshgrid)然后插入网格点的强度值(使用 griddata3),但最终结果 (vq) 不会是实际点 (ai,bi,ci) 和相应的强度,而是一组对可视化非常有用的插值点(例如,如果您想拟合适合实际数据的 3D 表面)。我只是想找到一种将实际数据点及其强度存储到文件中并将其导出的方法。非常感谢任何帮助。

4

2 回答 2

1

如果您想保存到允许导入可视化软件的文件,一系列 Tiff 文件很可能会很方便,即

maxValue = 2000; % this is the maximum signal that can possibly occur
                 % according to your code

for z = 1:size(vq,3)
   %# convert slice z to 16 bit
   currentSlice = vq(:,:,z);
   currentSlice = uint16(round(currentSlice/maxValue))
   %# save to file
   imwrite(currentSlice, sprintf('testImg_z%04i.tif',z),'tif');
end

请注意,如果创建尺寸为 1000x1000x1000 的双精度数组,则需要 8GB 的​​连续 RAM。

于 2012-06-24T01:44:17.000 回答
1

怎么样:

%# 3D array
voxels = zeros([1000 1000 1000]);

%# round points coordinates, and clamp to valid range [1,1000]
load coords
coords = round(coords);
coords = min(max(coords,1),1000);

%# convert to linear indices
idx = sub2ind(size(voxels), coords(:,1), coords(:,2), coords(:,3));

%# random values in the 2000 to 2001 range
v = rand(size(idx)) + 2000;

%# assign those values to the chosen points
voxels(idx) = v;
于 2012-06-24T07:07:30.990 回答