以下是我在matlab编写的代码的一部分,这里我想执行以下简单的数学运算[A] [X] = [B],其中[X]是未知的。在我的情况下,我的长度大约为1600000.所以我想要的是获得数组上每个元素的g1,g2和g3的值。我试过以下
k31 = omega3./(d)
k32 = omega3_2./(d)
A = [2,1,5;-2,-1,-5];
X = [g1;g2;g3];
for ii = 1:length(k31)
B = [k31(ii); k32(ii)];
X = pinv(A).*B;
end
display(g1,g2,g3)
我正在使用伪逆,所以基本上我可以得到每个X的解决方案,我在那里进行了一些编辑....并且x是未知的,数学上它可以完成,但我无法编码
另外,我如何用x和y绘制g1 g2 g3的值,如下所示:scatter(x(1:end-1),y(1:end-1),5,g1); scatter(x(1:end-1),y(1:end-1),5,g2)和scatter(x(1:end-1),y(1:end-1),5,g3)< / p>
答案 0 :(得分:1)
我必须在这里做一些假设,所以请耐心等待。
我怀疑你想这样做:
k31 = omega3./(d)
k32 = omega3_2./(d)
A = [2,1,5;-2,-1,-5];
X = cell(length(k31),1);
for ii = 1:length(k31)
X{ii} = A\[k31(ii); k32(ii)];
end
使用反斜杠运算符代替inv
或pinv
。输入help slash
以获取更多信息。
反斜杠运算符通常比inv
或pinv
更快,更准确。它也更灵活 - 你的情况是不确定的(你只能明确解决1个等式),在这种情况下,反斜杠运算符会找到最小二乘解。
请注意我如何将所有结果保存在cell-array X
中。这意味着可以通过
X{n} % == [g1(n) g2(n) g3(n)]
答案 1 :(得分:0)
在我看来,你最好从奇异值分解中创建一个伪逆。 Moore-Penrose伪逆会起作用,但我认为它有时会产生一些奇怪的结果。最小二乘可能不稳定,尤其是因为示例矩阵的等级未满。
也;不要计算每次迭代的倒数!
这是一个例子,其中A的等级缺陷被处理:
A = [2,1,5;-2,-1,-5];
% pseudo inverse of A
[m,n] = size(A);
% get SVD
[U,S,V] = svd(A);
% check rank
r = rank(S);
SR = S(1:r,1:r);
% make complete if rank is not full
SRc = [SR^-1 zeros(r,m-r);zeros(n-r,r) zeros(n-r,m-r)];
% create inverse
A_inv = V*SRc*U.';
X=[];
for i = 1:1600
% this actually takes most of the time
k31 = rand(1000, 1);
k32 = rand(1000, 1);
B = [k31';k32'];
% X is overwritten on every loop...
X = [X A_inv*B];
end
N_xy = 1000;
x = rand(N_xy,1);
y = rand(N_xy,1);
g1 = X(1,1:N_xy);
figure(1), clf
scatter(x,y,5,g1)
我没有绘制所有1600000点,因为那不是你想要的