有没有办法在Matlab中使用squeeze进行矢量化?

时间:2012-03-13 11:40:07

标签: matlab matrix vectorization

我目前正在使用squeeze从矩阵中删除两个单例维度。矩阵是一个大的4d矩阵M(:,:,:,:)。前两个维度是行坐标和列坐标(yx)。第三维中的变量(indexes)会在M的第三维中选择多个值。

在我正在运行的for循环中,矩阵M被解析为M(y,x,indexes,:),这使前两个维度成为单一维度。然后使用squeeze删除这些维度,以便在pdist中使用,如下所示:

pdist(squeeze(M(y,x,indexes,:)))

在这种情况下,我可以使用squeeze进行矢量化吗? (它在循环中占用了大量时间)

2 个答案:

答案 0 :(得分:5)

如果在循环内没有更改矩阵M,一个简单的解决方案是在运行for循环之前用PERMUTE重新排序矩阵维度:

Mperm = permute(M,[3 4 1 2]);

然后,您可以将Mperm代替M作为Mperm(:,:,y,x)

答案 1 :(得分:1)

对于使用reshape这类问题,通常会在挤压方面取得巨大进步。我有一个问题,挤压占用了一个功能所花费的时间的一半左右。使用分析器我可以看到挤压做了一些不必要的检查。使用重塑可将相同操作的时间减少到原始时间的15%。