我正在尝试找到在Matlab中标准化矩阵的最快方法(零均值,单位方差列).这一切都归结为将相同操作应用于矩阵中所有行的最快方法.我读过的每篇文章都得出了相同的结论:使用bsxfun而不是repmat.本文由Mathworks编写,是一个例子:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/
但是,在我自己的计算机上尝试这个时,repmat总是更快.以下是我使用与文章中相同代码的结果:
m = 1e5;
n = 100;
A = rand(m,n);
frepmat = @() A - repmat(mean(A),size(A,1),1);
timeit(frepmat)
fbsxfun = @() bsxfun(@minus,A,mean(A));
timeit(fbsxfun)
Run Code Online (Sandbox Code Playgroud)
结果:
ans =
0.0349
ans =
0.0391
Run Code Online (Sandbox Code Playgroud)
事实上,无论输入矩阵有多小或多大,我都无法在这种情况下使bsxfun表现得比repmat更好.
有人可以解释一下吗?
给定两个阵列A和B各含有n非负数,除去a>0从A的端部元件和b>0从B的端部元件评估这样的操作的成本,X*Y其中X是的总和a从删除的元素A和Y所述的总和b元件从...删除B.继续这样做直到两个数组都为空.目标是最小化总成本.
使用动态编程以及最优策略始终只从一个元素中获取一个元素的事实,A或者B我可以找到O(n ^ 3)解决方案.现在我很想知道这个问题是否有更快的解决方案?
编辑:在评论中窃取@recursive的一个例子:
A = [1,9,1],B = [1,9,1].可能与20的成本有关.(1)*(1 + 9)+(9 + 1)*(1)
我生成了这个图,用于测试等值线图在 matlab 上的工作原理。我想弄清楚是否有一种方法可以只绘制其中一条线,但不一定是第一条线。
Matlab 的解释是,如果你这样做:
contour(X,Y,Z,1);
Run Code Online (Sandbox Code Playgroud)
它会绘制其中一条线,但它始终是第一条线,但对于我的特殊情况,我想要第三条或第四条线。有没有办法在Matlab中做到这一点?