我正在尝试创建一个大小为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网格(使用网格网格)然后插入网格点的强度值(使用griddata3),但最终结果(vq)将不是实际点(ai,bi,ci)和相应的强度,而是一组插值的点,这对于可视化目的非常有用(例如,如果您想要拟合适合实际数据的3D表面)。 我只是想找到一种方法将实际数据点及其强度存储到文件中并导出它。 任何帮助都非常感谢。
答案 0 :(得分: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。
答案 1 :(得分: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;