【发布时间】:2016-01-13 21:52:05
【问题描述】:
我正在使用bsxfun 对具有大小矩阵之间的单例扩展的操作进行矢量化:
MS: (nms, nls)
KS: (nks, nls)
该运算是1:nms 中MS(m,l) 和m 和1:nls 中每个l 以及1:nks 中每个KS(k,l) 和k 之间的绝对差之和。
我是通过代码实现的:
[~, nls] = size(MS);
MS = reshape(MS',1,nls,[]);
R = sum(abs(bsxfun(@minus,MS,KS)));
R 的大小为 (nls, nms)。
我想将此操作推广到样本列表,因此新大小将是:
MS: (nxs, nls, nms)
KS: (nxs, nls, nks)
这可以通过为每个二维矩阵执行第一段代码的 for 循环轻松实现,但我怀疑通过添加新维度来概括以前的代码,性能可能会更好。
R 的大小为:(nxs, nls, nms)
我试图将MS 重塑为 4 维,但没有成功。这可以通过重塑和bsxfun来完成吗?
【问题讨论】:
-
可以,但是您对尺寸的描述对我来说有点不清楚。你能举个小例子吗?或者解释一下新尺寸与旧尺寸的关系?
-
我添加了一个基于
bsxfun和permute的答案。如果您的尺寸很大并且性能很重要,那么将permute放在首位可能会更快,以便summation 作用于连续的内存块。 -
你的意思是在 MS 上置换?
-
@jruizaranguren 我的意思是使用
sum(permute(abs(bsxfun(...)),[4 1 2 3]),1),其中...与以前相同。或者类似的东西,我不确定什么是最有效的。 -
@jruizaranguren 事实证明我的天真想法太天真了......我用可能的工作加速更新了我的答案。
标签: matlab matrix vectorization bsxfun