我在MATLAB中有一个函数,它执行Gram-Schmidt正交化,并对内积进行了非常重要的加权(我不认为MATLAB的内置函数支持这一点).据我所知,这个功能效果很好,但是在大型矩阵上它太慢了.改善这种情况的最佳方法是什么?
我已经尝试转换为MEX文件,但我失去了与我正在使用的编译器的并行化,因此它更慢.
我想在GPU上运行它,因为元素倍增是高度并行化的.(但我更喜欢实现方便携带)
任何人都可以将此代码矢量化或加快速度吗?我不确定如何优雅地做到这一点......
我知道这里的stackoverflow思想是惊人的,认为这是一个挑战:)
function [Q, R] = Gram_Schmidt(A, w)
[m, n] = size(A);
Q = complex(zeros(m, n));
R = complex(zeros(n, n));
v = zeros(n, 1);
for j = 1:n
v = A(:,j);
for i = 1:j-1
R(i,j) = sum( v .* conj( Q(:,i) ) .* w ) / ...
sum( Q(:,i) .* conj( Q(:,i) ) .* w );
v = v - R(i,j) * Q(:,i);
end
R(j,j) = norm(v);
Q(:,j) = v / R(j,j);
end …Run Code Online (Sandbox Code Playgroud) optimization performance matlab linear-algebra vectorization
我认为这可能是一个简单的数学问题,但我不知道现在发生了什么.
我在网络摄像头上捕捉"标记"的位置,我有一个标记及其坐标列表.四个标记是工作表面的外角,第五个(绿色)标记是小部件.像这样:
替代文字http://i37.tinypic.com/308cjtv.jpg
这是一些示例数据:
我想以某种方式将网络摄像头的小部件位置转换为坐标以显示在屏幕上,其中左上角是0,0而不是98,86并且以某种方式考虑了网络摄像头捕获的扭曲角度.
我甚至会从哪里开始?任何帮助赞赏
我想做一个函数来推广矩阵乘法.基本上,它应该能够进行标准矩阵乘法,但它应该允许通过任何其他函数更改两个二元运算符product/sum.
目标是在CPU和内存方面尽可能高效.当然,它总是比A*B效率低,但操作员的灵活性才是最重要的.
A = randi(10, 2, 3);
B = randi(10, 3, 4);
% 1st method
C = sum(bsxfun(@mtimes, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% Alternative: C = bsxfun(@(a,b) mtimes(a',b), A', permute(B, [1 3 2]))
% 2nd method
C = sum(bsxfun(@(a,b) a*b, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% 3rd method (Octave-only)
C = sum(permute(A, [1 3 2]) .* permute(B, [3 2 1]), 3)
% 4th method (Octave-only): multiply nxm A with nx1xd B to …Run Code Online (Sandbox Code Playgroud) 我有一个 MATLAB 订阅,我读到 MATLAB 使用英特尔 MKL 库,但我不确定在哪里可以找到与英特尔 MKL 库相对应的所有 DLL/文件。我可以在文档中找到任何提到它们位置的地方。
谢谢
matlab ×3
intel-mkl ×1
lapack ×1
math ×1
matrix ×1
octave ×1
optimization ×1
performance ×1
svd ×1