使用jacobian乘法函数,您可以解决表格的最小二乘问题
这样lb≤x≤ub
,对于问题在哪里C非常大,也许太大了。对于这种技术,使用'信任区域反光'
算法。
例如,考虑一个问题在哪里C是基于循环矩阵的2N-N族矩阵。行的行C是行矢量的班次V.。此示例具有行向量V.与表格的元素 :
那
元素循环移位的地方。
这个最小二乘示例考虑了问题在哪里
那
和约束是 为了 。
足够大 ,密集的矩阵C不适合计算机内存( 一个测试系统太大)。
Jacobian乘法函数具有以下语法。
w = jmfcn(jinfo,y,flag)
jinfo.
是矩阵相同的尺寸C,用作前提者。如果C太大而无法适应记忆,jinfo.
应该稀疏。y
是矢量或矩阵大小C * Y.
或者c'* y
用作矩阵乘法。旗帜
讲JMFCN.
哪个产品形成:
旗帜
> 0⇒w = c * y
旗帜
<0⇒w = c'* y
旗帜
= 0⇒w = c'* c * y
因为C是一种简单的结构矩阵,可以轻松地在向量方面写一个jacobian乘法函数V.;也就是说,没有形成C。每一排C * Y.
是循环移位版本的产品V.时代y
。用快速
循环移位V.。
计算C * Y.
,计算v * Y.
找到第一行,然后转移V.并计算第二行,等等。
计算c'* y
,执行相同的计算,但使用移动版本临时
,由第一行形成的矢量C'
:
temp = [fliplr(v),pliplr(v)];
temp = [Cirsprift(TEMP,1,2),CIRCSHIFT(TEMP,1,2)];%现在temp = c'(1,:)
计算c'* c * y
,简单地计算C * Y.
使用班次V.,然后计算C'
使用班次的结果Pliplr(v)
。
辅助功能lsqcirculant3.
是一种实现此过程的Jacobian乘法功能;它出现在此示例的结尾。
这dolsqjac3.
辅助功能在此示例的结尾设置矢量V.并拨打求解器Lsqlin.
使用lsqcirculant3.
Jacobian乘法函数。
什么时候N
= 3000,C是一个18,000,000元素的密集基质。确定结果dolsqjac3.
功能N
选择值= 3000X,并显示输出结构。
[x,Resnorm,Reseal,ExitFlag,输出] = Dolsqjac3(3000);
地方最低可能。LSQLIN停止,因为功能值的相对变化小于功能公差。
DISP(x(1))
5.0000
DISP(x(1500))
-0.5201.
DISP(x(3000))
-5.0000
DISP(输出)
迭代:16算法:'信任区域 - 反光'Firstordoptopt:5.9351E-05 Cgiterations:36 CorroudViration:[] linearsolver:[]消息:'局部最少可能。↵↵lsqlin停止,因为函数值的相对变化小于功能公差。“
此代码创建lsqcirculant3.
帮手功能。
功能w = lsqcirculant3(jinfo,y,标志,v)%此功能计算Jacobian乘法函数对于2N-By-N循环矩阵示例的%如果标志> 0 w = jpositive(y);eleesif标志<0 w = jnegative(y);别的w = jnegative(jpositive(y));结尾功能a = jpositive(q)%计算c * qtemp = v;a = zeros(尺寸(q));%分配矩阵aa = [a; a];%结果是输入的两倍。为了r = 1:大小(a,1)a(r,:)= temp * q;%计算第一个行temp = Cirsprift(TEMP,1,2);%转移循环结尾结尾功能a = jnegative(q)%计算c'* qtemp = pliplr(v);temp = Cirsprift(TEMP,1,2);%转移循环的c'Len =尺寸(q,1)/ 2;%返回的向量只有一半%作为输入向量。A =零(LEN,尺寸(Q,2));%分配矩阵a为了r = 1:len a(r,:) = [temp,temp] * q;%计算第一个行temp = Cirsprift(TEMP,1,2);%转移循环结尾结尾结尾
此代码创建dolsqjac3.
帮手功能。
功能[x,Resnorm,Residual,ExitFlag,输出] = Dolsqjac3(n)%r = 1:n-1;制作载体的%索引v(n)=(-1)^(n + 1)/ n;%分配矢量vv(r)=(-1)。^(r + 1)./ r;%现在C应该是基于V的2N-N循环矩阵,%,但它可能太大,不能适应内存。r = 1:2 * n;d(r)= n-r;jinfo = [speye(n); speye(n)];预处理的%稀疏矩阵%该矩阵是求解器所需的输入;在此示例中未使用%预处理。%传递矢量v,以便它不需要%在雅可比乘法函数中计算。选项= Optimoptions('lsqlin'那'算法'那'信任区域反光'那......'jacobianmultiplyfcn',@(jinfo,y,flag)lsqcirculant3(jinfo,y,flag,v));lb = -5 *α(1,n);UB = 5 *那些(1,n);[x,Resnorm,剩余,ExitFlag,输出] =......LSQLIN(JINFO,D,[],[],[],[],LB,UB,[],选项);结尾