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)
这段代码有什么问题吗?我怎么能改进它?
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)
强迫它进入一个列.
你的解决方案很好。
请注意,horizcat 对于大型矩阵会造成严重的性能损失。它使代码的复杂度为 O(N^2) 而不是 O(N)。对于 100x10,000 矩阵,您的实现在我的机器上需要 2.6 秒,horizcat 需要 64.5 秒。对于 100x5000 矩阵,horizcat 实现需要 15.7 秒。
如果您愿意,您可以稍微概括您的函数,并使其能够迭代最终维度甚至任意维度(不仅仅是列)。