我的问题:我注意到很多关于SO的Matlab问题的好答案经常使用这个功能bsxfun.为什么?
动机:在Matlab文档中bsxfun,提供了以下示例:
A = magic(5);
A = bsxfun(@minus, A, mean(A))
Run Code Online (Sandbox Code Playgroud)
当然我们可以使用以下方法执行相同的操作:
A = A - (ones(size(A, 1), 1) * mean(A));
Run Code Online (Sandbox Code Playgroud)
事实上,简单的速度测试表明第二种方法的速度提高了约20%.那么为什么要使用第一种方法?我猜测在某些情况下使用bsxfun将比"手动"方法快得多.我真的很想看到这种情况的一个例子,并解释为什么它更快.
此外,这个问题的最后一个元素,再次来自Matlab文档bsxfun:"C = bsxfun(fun,A,B)将函数句柄fun指定的逐元素二元运算应用于数组A和B,使用单例扩展已启用." 短语"启用单例扩展"是什么意思?
假设我有输入data = [1 2 3 4 5 6 7 8 9 10]
和num = 4.我想用这些来生成以下内容:
i = [1 2 3 4 5 6; 2 3 4 5 6 7; 3 4 5 6 7 8; 4 5 6 7 8 9]
o = [5 6 7 8 9 10]
Run Code Online (Sandbox Code Playgroud)
这基于以下逻辑:
length of data = 10
num = 4
10 - 4 = 6
i = [first 6; second 6;... num times]
o = [last 6]
Run Code Online (Sandbox Code Playgroud)
在MATLAB中自动执行 …
我有一个b包含30个条目的向量.
我想避免使用for循环来构造这样的矩阵:
其中b_i是i向量的第n个条目b.
例如,定义向量
b = [2 6 -7 3 1 -4 -1 1 11 8 -4 9 2 0 2 -1 0 4 4 4 2 -4 2 5 1 3 2 -1 1 -2]
Run Code Online (Sandbox Code Playgroud)
我尝试使用for循环的地方是:
A = zeros(5,5);
for i = 1:5
A(i) = b(i+5);
A(i+5) = b(i+6);
A(i+10) = b(i+7);
A(i+15) = b(i+8);
A(i+20) = b(i+9);
end
Run Code Online (Sandbox Code Playgroud)
结果是
有没有更快更通用的方法来生成这个矩阵?