Todos conhecemos os muitos métodos computacionais para resolver o sistema linear padrão
No entanto, estou curioso para saber se existem métodos computacionais "padrão" para resolver um sistema linear mais geral (dimensão finita) da forma
onde, digamos, é umamatriz , é umamatriz e é um operador linear que leva matrizes para matrizes, o quenão envolve a vetorização das matrizes, ou seja, a conversão de tudo para o formato padrão .
A razão pela qual pergunto é que preciso resolver a seguinte equação para :
onde é a 2d transformada de radônio, é adjacente e e são 2d matrizes (imagens). É possível vetorizar essa equação, mas é uma dor, especialmente se formos para o 3D.
De um modo mais geral, e as matrizes ? Por exemplo, resolver onde e são matrizes 3D (também precisarei fazer isso com a transformação Radon em algum momento).
Agradecemos antecipadamente e sinta-se à vontade para me enviar para outro StackExchange, se achar necessário.
linear-algebra
icurays1
fonte
fonte
Respostas:
Uma coisa que você deve ter cuidado ao implementar o CG (ou abordagens iterativas semelhantes) com operadores lineares gerais é implementar corretamente o acessório do seu operador linear. Ou seja, as pessoas geralmente acertam , mas cometem um erro ao implementar .z = F ∗ ( y )y=F(x) z=F∗(y)
Eu recomendo implementar um teste simples que aproveite a seguinte identidade: para qualquer e conformidade , Portanto, o que você faz é gerar valores aleatórios de e , executá-los através de suas operações avançadas e adjuntas, respectivamente, e calcular os dois produtos internos acima. Verifique se eles correspondem à precisão razoável e repita algumas vezes.y ⟨ y , F ( x ) ⟩ = ⟨ F * ( y ) , x ⟩ . x yx y
EDIT: o que você faz se o seu operador linear é simétrico? Bem, você também precisa verificar essa simetria. Portanto, use o mesmo teste, apenas observando que --- aplica a mesma operação a e . Obviamente, o OP possui um operador assimétrico e um simétrico para lidar com ... x yF=F∗ x y
fonte
linop_test.m
rotina por esse motivo. Esse pacote também suporta matrizes, matrizes e produtos cartesianos em espaços vetoriais.Como se vê, porque meu sistema é simétrico e definido positivamente (como meu operador linear é escrito como ), o gradiente conjugado pode ser adaptado para resolver iterativamente esse tipo de equação. A única modificação ocorre ao calcular produtos internos - ou seja, um cálculo típico de produto interno no CG se parece com ou . Na versão modificada, usamos o produto interno Frobenius, que pode ser calculado somando as entradas do produto Hadamard (pointwise). Ou seja,r T k r k p T k A p kR∗R+λI rTkrk pTkApk
Eu suspeito que isso funcionará perfeitamente quando eu atualizar para matrizes 3D, embora ainda não tenha visto o produto interno Frobenius definido em matrizes 3D (trabalharei com a premissa de que posso somar novamente o produto pontual).
Eu ainda estaria interessado em métodos mais gerais, se alguém souber de algum!
fonte