我有200
个时间点,对于每个时间点,有一个大小为40*40 double
的图像对应于这个时间点,例如image 1
对应于time point 1
; image k
对应于time point k
(k = 1,2,...,200
)。
时间点为T = 1:200
,图像命名为Image_T
,因此为Image_1
、Image_2
等。
我想把所有这些200
图像放在一起。最终的大小是40*40*200
的两倍。最终的图像看起来像fMRI图像(fmri_szX = 40
,fmri_szY = 40
和fmri_szT = 200
)。如何实现?谢谢!
1条答案
按热度按时间fnvucqvd1#
动态变量
请注意,虽然这是 * 可能的 *,但它被认为是糟糕的编程(例如,请参阅此处,或this blog by Loren,甚至Mathworks在其documentation中告诉您不要这样做)。将图像直接加载到3D数组或单元格结构中会更好,避免动态变量名。我只是为了完整性而发布了这篇文章;如果您曾经碰巧使用过这个解决方案,您应该立即更改为(cell-)数组。
关于
eval
为什么是个坏主意的链接文章的要点是,MATLAB再也不能预测操作的结果了。例如,A=3*(2:4)
被MATLAB识别为输出双精度数组。如果你使用eval
,MATLAB就不能再做这件事了。MATLAB是一种解释性语言,即每一行代码都是读取然后运行的。这意味着每次MATLAB遇到eval
时,它必须停止,计算表达式,然后检查输出,存储,然后继续。MATLAB使用的大多数速度引擎(JIT/MAGMA等)在不预测语句结果的情况下无法工作,因此将在eval
求值期间关闭,使您的代码非常缓慢。使用
eval
还有一个安全方面。现在
accumvar
将包含所需的变量名。但如果你不将accumvar
设置为输出,你可能也不使用disp
,而是使用eval('rm -rf ~/*')
,它甚至不告诉你它正在格式化整个磁盘。环路进近
注意我让
for
循环向后运行,以便以最大的大小初始化A
。半矢量化方法
eval
不支持数组,因此不能直接插入cellarraystr
。动态文件名
尽管有一个类似上面的标题,这意味着有你的 * 文件名 * 结构,所以在文件浏览器,而不是MATLAB。我在这里假设.jpg文件,但你可以添加每一个支持的图像扩展名。此外,确保有 * 所有 * 图像在一个单一的文件夹,没有其他图像与该扩展名,或您必须修改
dir()
调用,以包括只需要的图像。图像通常被读取为
m*n*3
文件,其中m*n
是图像的像素大小,而3
源于它们被imread
读取为RGB的事实。因此,A
现在是一个4D矩阵,结构为m*n*3*T
,其中最后一个索引对应于图像的时间。前三个是RGB格式的图像。由于您没有指定如何获得
40*40
双精度浮点数,因此我保留了4D矩阵。可能您读取了它们,然后切换到使用RGB的uint16
解释,这是一个单一的数字,这将导致m*n*1*T
变量,您可以通过调用A = squeeze(A(:,:,1,:));
将其简化为3D变量