迭代矩阵列的最佳方法是什么?

dmn*_*mnd 10 matlab enumeration matrix

我想用MATLAB将函数应用于矩阵中的所有列.例如,我希望能够在矩阵的每一列上调用平滑,而不是将矩阵平滑地视为向量(如果调用则这是默认行为smooth(matrix)).

我敢肯定必须有更惯用的方法来做到这一点,但我找不到它,所以我定义了一个map_column函数:

function result = map_column(m, func)
    result = m;
    for col = 1:size(m,2)
        result(:,col) = func(m(:,col));
    end
end
Run Code Online (Sandbox Code Playgroud)

我可以打电话给:

smoothed = map_column(input, @(c) (smooth(c, 9)));
Run Code Online (Sandbox Code Playgroud)

这段代码有什么问题吗?我怎么能改进它?

Tim*_*omb 9

MATLAB"for"语句实际上循环遍历任何提供的列 - 通常,这只会产生一系列标量,因为传入的向量(如上例所示)是行向量.这意味着您可以像这样重写上面的代码:

function result = map_column(m, func)
    result = [];
    for m_col = m
      result = horzcat(result, func(m_col));
    end
Run Code Online (Sandbox Code Playgroud)

如果func没有返回列向量,那么你可以添加类似的东西

f = func(m_col);
result = horzcat(result, f(:));
Run Code Online (Sandbox Code Playgroud)

强迫它进入一个列.


Mr *_*ooz 3

你的解决方案很好。

请注意,horizcat 对于大型矩阵会造成严重的性能损失。它使代码的复杂度为 O(N^2) 而不是 O(N)。对于 100x10,000 矩阵,您的实现在我的机器上需要 2.6 秒,horizcat 需要 64.5 秒。对于 100x5000 矩阵,horizcat 实现需要 15.7 秒。

如果您愿意,您可以稍微概括您的函数,并使其能够迭代最终维度甚至任意维度(不仅仅是列)。