Matlab 中的 4D 矩阵运算
4D matrix operations in Matlab
我在 Matlab 中有一组 4D 矩阵。前三个维度是空间的,最后一个是时间的。这意味着每个体素都是一个时间序列。如果Img是4D图像,Img(x,y,z,:)就是坐标为(x,y,z)的体素的时间序列。
现在我想对图像的每个时间序列进行归一化(零均值和单位方差)。我怎样才能做到这一点?也许用 zscore(Img,[],4)
?
其次,我想拼接所有图像的时间序列。假设 Img1、Img2、Img3、....Imgn 是 4D 图像。对于每个体素,我想连接所有图像的时间序列,以便最终我得到一个具有相同空间但扩展时间维度的 4D 图像。因此,假设体素具有坐标 (x,y,z),则串联的时间序列将为 [squeeze(Img1(x,y,z,:)); squeeze(Img2(x,y,z,:));....;squeeze(Imgn(x,y,z,:))]
。这应该对所有体素完成。
我该怎么做?可以用 for 循环来完成,但这效率不高。
第一个问题:归一化
这可以通过 bsxfun
轻松完成:
Img = bsxfun(@rdivide, Img, std(Img,0,4)); %// unit variance. Or change 0 to 1; see std
Img = bsxfun(@minus, Img, mean(Img,4)); %// zero mean
第二题:连接
只需沿第四维度使用cat
:
result = cat(4, Img1, Img2, Img3);
如果您将所有图像都放在一个元胞数组中会更容易:
cellImgs = {Img1, Img2, Img3};
因为这样你就可以使用 comma-separated list
result = cat(4, cellImgs{:});
因此代码与图像数量无关。
我在 Matlab 中有一组 4D 矩阵。前三个维度是空间的,最后一个是时间的。这意味着每个体素都是一个时间序列。如果Img是4D图像,Img(x,y,z,:)就是坐标为(x,y,z)的体素的时间序列。
现在我想对图像的每个时间序列进行归一化(零均值和单位方差)。我怎样才能做到这一点?也许用 zscore(Img,[],4)
?
其次,我想拼接所有图像的时间序列。假设 Img1、Img2、Img3、....Imgn 是 4D 图像。对于每个体素,我想连接所有图像的时间序列,以便最终我得到一个具有相同空间但扩展时间维度的 4D 图像。因此,假设体素具有坐标 (x,y,z),则串联的时间序列将为 [squeeze(Img1(x,y,z,:)); squeeze(Img2(x,y,z,:));....;squeeze(Imgn(x,y,z,:))]
。这应该对所有体素完成。
我该怎么做?可以用 for 循环来完成,但这效率不高。
第一个问题:归一化
这可以通过 bsxfun
轻松完成:
Img = bsxfun(@rdivide, Img, std(Img,0,4)); %// unit variance. Or change 0 to 1; see std
Img = bsxfun(@minus, Img, mean(Img,4)); %// zero mean
第二题:连接
只需沿第四维度使用cat
:
result = cat(4, Img1, Img2, Img3);
如果您将所有图像都放在一个元胞数组中会更容易:
cellImgs = {Img1, Img2, Img3};
因为这样你就可以使用 comma-separated list
result = cat(4, cellImgs{:});
因此代码与图像数量无关。