|
在MATLAB中,(:) 有一个超级简单但极强的功能:把任意维数的数组按列优先拉平成一个列向量。 无论A原来是
只要你写:v = A(:); 你就得到了一个1列向量。 由于MATLAB的底层存储是column-major(Fortran存储方式),也就是我们知道的“列优先”,A的内存排布是: A(:,1), A(:,2), A(:,3), ... 依次排布 所以(:) 实际上是把内存顺序完全平铺出来,零开销、非常快。因此(:) “一键拉直”的价值在于把复杂的多维问题变成 1D 处理:
(:) 的常用搭档:reshape 如果你把矩阵拉直了,还想重新变回去或者改变维度: A1 = reshape(v, size(A));B = reshape(A, new_rows, new_cols);Matlab 中 reshape 不改变底层数据,只改变“视图”(维度解释方式),例如:A = reshape(1:8, [2 4]) 的内存是 [1 2 3 4 5 6 7 8],只不过被解释成了:
使用(:) 展平实际上就是“把视图变回一维”。 使用reshape的元素数量必须一致,否则会报错,并且reshape后的矩阵任然是按列优先构造的,理解了这个,你对所有维度变换都会立刻做到“不用试就知道结果”。 应用场景1:矩阵按条件修改(不想写for),例如你把超过阈值的所有点压成th,无需循环,也不需要 find: th = 0.5;A = rand(1024, 4096);v = A(:);v(v > th) = th;A2 = reshape(v, size(A));应用场景2:对某个维度做操作,但算法更适合 1D 写,例如你想对矩阵所有元素归一化,多维矩阵的全局归一化变得非常优雅:
由于底层线性数据不动,reshape(A,3,2) 只是把这段数据按新的维度解释,并没有复制数据的操作,因此速度极快(O(1)的操作),在你做复杂数据维度变换时无需担心性能。 |
|
|