分享

“知道前不知道,知道后忘不掉!”的Matlab小妙招

 汉无为 2025-11-19 发布于湖北

MATLAB中,(:) 有一个超级简单但极强的功能:把任意维数的数组按列优先拉平成一个列向量。

无论A原来是

  • 维、维、维、

  • 4×4512×1024128×128×64

只要你写:v = A(:); 你就得到了一个1列向量。

由于MATLAB的底层存储是column-major(Fortran存储方式),也就是我们知道的“列优先”,A的内存排布是:

A(:,1), A(:,2), A(:,3), ... 依次排布

所以(:) 实际上是把内存顺序完全平铺出来,零开销、非常快。因此(:) “一键拉直”的价值在于把复杂的多维问题变成 1D 处理:

  • 按某些条件修改矩阵中一部分元素;

  • 对每个元素做某种操作;

  • 批处理N×数据;

  • 写算法时只想“对所有样本做某件事”,而不是处理多维结构。

(:) 的常用搭档: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],只不过被解释成了:

1 3 5 72 4 6 8

使用(:) 展平实际上就是“把视图变回一维”。

使用reshape的元素数量必须一致,否则会报错,并且reshape后的矩阵任然是按列优先构造的,理解了这个,你对所有维度变换都会立刻做到“不用试就知道结果”。

应用场景1矩阵按条件修改(不想写for),例如你把超过阈值的所有点压成th,无需循环,也不需要 find

th = 0.5;A = rand(10244096);v = A(:);v(v > th) = th;A2 = reshape(v, size(A));

应用场景2对某个维度做操作,但算法更适合 1D 写,例如你想对矩阵所有元素归一化,多维矩阵的全局归一化变得非常优雅:

A = rand(2561024);v = A(:);v = (v - min(v)) / (max(v) - min(v));A_norm = reshape(v, size(A));

由于底层线性数据不动,reshape(A,3,2) 只是把这段数据按新的维度解释,并没有复制数据的操作,因此速度极快(O(1)的操作),在你做复杂数据维度变换时无需担心性能。

是不是(:)reshape的这个过程一旦理解了,你就再也忘不掉了?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多