记一次思考过程
问题缘起于一个作图呈现,比如我想呈现一个这样的图,
我知道的内容有:brainnetviewer可以做,但是做出这样的图需要准备两个文件,一个是surface的文件,这个已经有了;另外一个则是一个nii文件,nii文件的每一个脑区的值对应着这边显示的颜色,所以我的问题就是如何为nii文件也就是aal.nii文件的对应的值赋予一个特定的值,这里我是想用脑网络中的nodal efficiency来赋值。
那么根据这个思路继续思考,要想赋予新的值,首先要把旧的值读取出来,也就是要读取aal.nii的每一个脑区的值,借助于spm_image或者matlab矩阵操作读取相应的值,发现每一个脑区的值对应的是它在aal模板中的数字编号,比如脑区67的值就是67,但是aal.nii包含有116个脑区,我们关注的只是90个脑区,因此要把91-116的脑区去除掉,也就是把相应的值变为零。其实,我想要的操作本质上与制作mask很类似,于是继续寻找解决办法。
发现借助于spm的一些函数可以实现这些操作,也就是spm_read_vols、spm_write_vol、spm_vols等等操作,其实到这一步已经标志着问题解决了,其余就是细节上的实现——读取原来的nii文件,把原来的对应脑区的值用新的值来代替。
但在实际进行中还是遇到了新的问题,比如因为要赋予的新的值大多集中在0.30左右,并没有超过1,写了代码实现这个功能,但是运行之后发现所有的值都变为了0,仔细检查并没有发现逻辑上的问题。
那么根据这个思路继续思考,要想赋予新的值,首先要把旧的值读取出来,也就是要读取aal.nii的每一个脑区的值,借助于spm_image或者matlab矩阵操作读取相应的值,发现每一个脑区的值对应的是它在aal模板中的数字编号,比如脑区67的值就是67,但是aal.nii包含有116个脑区,我们关注的只是90个脑区,因此要把91-116的脑区去除掉,也就是把相应的值变为零。其实,我想要的操作本质上与制作mask很类似,于是继续寻找解决办法。
发现借助于spm的一些函数可以实现这些操作,也就是spm_read_vols、spm_write_vol、spm_vols等等操作,其实到这一步已经标志着问题解决了,其余就是细节上的实现——读取原来的nii文件,把原来的对应脑区的值用新的值来代替。
但在实际进行中还是遇到了新的问题,比如因为要赋予的新的值大多集中在0.30左右,并没有超过1,写了代码实现这个功能,但是运行之后发现所有的值都变为了0,仔细检查并没有发现逻辑上的问题。
于是再去google了下spm_write_vol函数的使用,看能否寻找到一些思路。果不其然,经过一番思考与检索把问题集中到了数据类型的问题上,因为在用spm_read查看得到的nii文件时,注意到了数据类型是unit8,突然想到数据类型可能导致了赋予的新的值都变为了0。
于是转向了新的问题,就是解决数据格式转换的问题,继续检索,在github上找到解决方案,轻而易举把unit8的nii转换为float类型的nii文件,于是你问题得到了解决。
于是转向了新的问题,就是解决数据格式转换的问题,继续检索,在github上找到解决方案,轻而易举把unit8的nii转换为float类型的nii文件,于是你问题得到了解决。
这一套操作,波波折折,却也是趣味无穷,趣味无穷是因为像是在玩一个通关游戏,思考与反馈促使自己不断逼近问题的答案。深有感悟的一点是,面对一个问题,你先要清楚你的问题是什么,要可以准确的描述你的问题,如果思考不出来,可以google,最好是英文搜索,因为在学术领域,英文搜索出来的大多数是一手的知识,而中文搜索到的很多都是二手或者转手了很多次的知识,也就意味着中文检索出来的结果信噪比很低【比如你如果现在看到了我的内容,对于你解决感兴趣的问题可能帮助不大,但或许会对你思维的变通有些许启发 】,如果你可以准确地用英文描述你的问题,很大概率可以获得对解决问题有益的线索。
在解决问题中峰回路转的感受给人以莫名的欣喜,就像今天下午在人定湖公园看到两个水龙头在草坪上交织闪现的彩虹和你大爷们高高放起的风筝,就是觉得nice。
2019-09-01
今日时刻:今日新生报到,北师大正南门难得开了一次。