-5

下面是我在matlab中写的一段代码,这里我要进行如下简单的数学运算[A][X]=[B],其中[X]是未知的。在我的情况下,我的 k 长度约为 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)

4

2 回答 2

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

它使用反斜杠运算符而不是invor pinv。键入help slash以获取更多信息。

反斜杠运算符通常比invor更快、更准确pinv。它也更加灵活——你的情况是不确定的(你比能够显式求解的方程少 1 个),在这种情况下,反斜杠运算符将为你找到一个最小二乘解。

请注意我如何将所有结果保存在cell-array X中。这意味着第n解决方案将可以通过

X{n}    % == [g1(n) g2(n) g3(n)]
于 2012-11-08T10:21:56.747 回答
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 点,因为那不是你想要的

于 2012-11-08T11:46:02.190 回答