- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经在 DIY linalg 解算器上工作了几天,并且它组合在一起(对于 you guys at stackexchange 来说不是小事)但我目前正在经历脑放屁并且不能'看不出当前代码有什么问题。任何见解将不胜感激;你们摇滚!
下面的代码应该是可复制粘贴的;结果应该是 -15,8,2,但它目前输出的是 2,inf,-inf,不用说,这是不正确的。
编辑:我认为最后需要修复的是 Back Substitution/Ux=x 阶段,但据我所知这是“正确的”。我正在关注 this example检查我的中间工作
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAT1 3
#define TINY 1e-20
#define a(i,j) a[(i)*MAT1+(j)]
void h_pivot_decomp(float *a, int *p, int *q){
int i,j,k;
int n=MAT1;
int pi,pj,tmp;
float max;
float ftmp;
for (k=0;k<n;k++){
pi=-1,pj=-1,max=0.0;
//find pivot in submatrix a(k:n,k:n)
for (i=k;i<n;i++) {
for (j=k;j<n;j++) {
if (fabs(a(i,j))>max){
max = fabs(a(i,j));
pi=i;
pj=j;
}
}
}
//Swap Row
tmp=p[k];
p[k]=p[pi];
p[pi]=tmp;
for (j=0;j<n;j++){
ftmp=a(k,j);
a(k,j)=a(pi,j);
a(pi,j)=ftmp;
}
//Swap Col
tmp=q[k];
q[k]=q[pj];
q[pj]=tmp;
for (i=0;i<n;i++){
ftmp=a(i,k);
a(i,k)=a(i,pj);
a(i,pj)=ftmp;
}
//END PIVOT
//check pivot size and decompose
if ((fabs(a(k,k))>TINY)){
for (i=k+1;i<n;i++){
//Column normalisation
ftmp=a(i,k)/=a(k,k);
for (j=k+1;j<n;j++){
//a(ik)*a(kj) subtracted from lower right submatrix elements
a(i,j)-=(ftmp*a(k,j));
}
}
}
//END DECOMPOSE
}
}
void h_solve(float *a, float *x, int *p, int *q){
//forward substitution; see Golub, Van Loan 96
//And see http://www.cs.rutgers.edu/~richter/cs510/completePivoting.pdf
int i,ii=0,ip,j,tmp;
float ftmp;
float xtmp[MAT1];
//Swap rows (x=Px)
puts("x=Px Stage");
for (i=0; i<MAT1; i++){
xtmp[i]=x[p[i]]; //value that should be here
printf("x:%.1lf,q:%d\n",xtmp[i],q[i]);
}
//Lx=x
puts("Lx=x Stage");
//I suspect this is where this is falling down, as my implementation
//uses the combined LU matrix, and this is using the non-unit diagonal
for (i=0;i<MAT1;i++){
ftmp=xtmp[i];
if (ii != 0)
for (j=ii-1;j<i;j++)
ftmp-=a(i,j)*xtmp[j];
else
if (ftmp!=0.0)
ii=i+1;
xtmp[i]=ftmp;
printf("x:%.1lf,q:%d\n",xtmp[i],q[i]);
}
puts("Ux=x");
//backward substitution
//partially taken from Sourcebook on Parallel Computing p577
//solves Uy=z
for (j=0;j<MAT1;j++){
xtmp[j]=xtmp[j]/a(j,j);
for (i=j+1;i<MAT1;i++){
xtmp[i]-=a(i,j)*xtmp[j];
}
printf("x:%.1lf,q:%d\n",xtmp[i],q[i]);
}
//Last bit
//solves x=Qy
puts("x=Qx Stage");
for (i=0;i<MAT1;i++){
x[i]=xtmp[p[i]];
printf("x:%.1lf,q:%d\n",x[i],q[i]);
}
}
void main(){
//3x3 Matrix
//float a[]={1,-2,3,2,-5,12,0,2,-10};
//float a[]={1,3,-2,3,5,6,2,4,3};
//float b[]={5,7,8};
//float a[]={1,2,3,2,-1,1,3,4,-1};
//float b[]={14,3,8};
float a[]={1,-2,1,0,2,2,-2,4,2};
float b[]={1,4,2};
int sig;
puts("Declared Stuff");
//pivot array (not used currently)
int* p_pivot = (int *)malloc(sizeof(int)*MAT1);
int* q_pivot = (int *)malloc(sizeof(int)*MAT1);
puts("Starting Stuff");
for (unsigned int i=0; i<MAT1; i++){
p_pivot[i]=i;
q_pivot[i]=i;
printf("%.1lf|",b[i]);
for (unsigned int j=0;j<MAT1; j++){
printf("%.1lf,",a(i,j));
}
printf("|%d,%d",p_pivot[i],q_pivot[i]);
puts("");
}
h_pivot_decomp(&a[0],p_pivot,q_pivot);
puts("After Pivot");
for (unsigned int i=0; i<MAT1; i++){
printf("%.1lf|",b[i]);
for (unsigned int j=0;j<MAT1; j++){
printf("%.1lf,",a(i,j));
}
printf("|%d,%d",p_pivot[i],q_pivot[i]);
puts("");
}
h_solve(&a[0],&b[0],p_pivot,q_pivot);
puts("Finished Solve");
for (unsigned int i=0; i<MAT1; i++){
printf("%.1lf|",b[i]);
for (unsigned int j=0;j<MAT1; j++){
printf("%.1lf,",a(i,j));
}
puts("");
}
}
最佳答案
已排序;见here完整的答案和代码;有太多小问题无法逐条列出。
编辑 更新链接(7 年后人们仍然需要这个?!:D)
关于C:LU完全旋转分解和矩阵求解器;有些不对劲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695029/
我正在尝试主要基于 LU decomposition with partial pivoting Matlab 来处理我的 lu 分解 function [L,U,P] = lup(A) n = le
我试图通过使用 LU 分解来求解 Ax=b,但不知何故我无法通过乘以 L*U 来得到 A。这是代码和结果; A = array([2,3,5,4]).reshape(2,2) b = array([4
设 A 为以下矩阵: 1 3 2 4 如果我调用 lu( ) 函数并像这样保存返回值: [L, U] = lu(A); MATLAB 返回 L, U 使得 L * U = A: >> L * U an
我在 cython 中编写了以下 Matrix 类 用于矩阵求逆和其他一些线性代数运算。我尝试使用LU 分解 来计算矩阵的逆。代码速度很好。我试图实现 this code在 cython 中。我已经检
以下函数不使用行透视进行 LU 分解。 R 中是否有一个现有的函数可以使用行数据进行 LU 分解? > require(Matrix) > expand(lu(matrix(rnorm(16),4,4
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我按照算法写了代码,但是结果不对。根据算法,我们必须指明矩阵的维数,并手动填写主矩阵A和 vector B。我们需要生成一个LU矩阵。它已生成,但编号错误。最后我们必须得到带有解的 vector X。
我正在做 LU decom,我在 googel 上找到了这段代码,但想通过输出“pvt”和“a”来理解它,但它似乎是我的 pvt 不正确,所以我得到了一些不同的东西所以请问谁能纠正我 ..谢谢 这是我
给定 L 和 U LU decomposition和常数 b 的向量使得 LU*x=b ,是否有找到 x 的内置函数?意思是 - X = functionName(L,U,b) 请注意,在 L 和 U
lu 在这种情况下是什么意思: size_t size = 10lu; 我一无所获。 谢谢! 最佳答案 简化:这意味着 unsigned long。 另请引用this. 关于c++ - 变量定义中 "
我在 c# 中偶然发现了这个正则表达式,我想移植到 javascript,但我不明白以下内容: [-.\p{Lu}\p{Ll}0-9]+ 我很难理解的部分当然是\p{Lu}。我访问过的所有正则表达式网
应该如何解释这一规则 fragment LETTER_UPPERCASE : [\p{Lu}] ; 在 https://github.com/okellogg/ada_antlr_grammar/b
应该如何解释这一规则 fragment LETTER_UPPERCASE : [\p{Lu}] ; 在 https://github.com/okellogg/ada_antlr_grammar/b
Lu 应该代表 Letter, Uppercase,但是我得到意想不到的结果 PS > 'Hello World' -replace '\p{Lu}', 'Z' ZZZZZ ZZZZZ 可以看出,Lu
我知道用 %lu 打印一个无符号长整数是不好的做法。在我正在从事的一个项目中,当我尝试以 snprint 格式用 %lu 打印 11 时,我得到了一个很大的数字。(旧代码)我使用的是 gcc 4.9.
我对下面的代码有问题,经过一些研究我在单独的一行中挑出了这个问题,但现在不确定如何解决它。 typedef double ComplexType; typedef std::complex Compl
我正在使用 Armadillo C++ 库求解中/大型线性系统(1000-5000 个方程)。 因为我必须解决不同的线性系统 AX=b 其中 A 始终相同而 B 发生变化,我只想对 A 进行 LU 分
我正在使用 C++ 中的 Eigen 库来求解稀疏线性方程:Ax=b 其中,A 是一个稀疏方阵,b 是一个矩形稀疏矩阵。我有多个 A 矩阵实例,每个实例都有多个右侧 b。因此,我想对所有 A 矩阵进行
更新:这是解决方案,我向每一行添加了一个标量以控制下溢和上溢。感谢大家的帮助。 我一直在研究 C++ 中的 LU 分解,希望有一天能分解并求解大型稀疏矩阵。我找到了一些代码并对其进行了修改以供自己使用
我目前在将数组分解为上 (u) 和下 (l) 数组时遇到一些问题。 我正在使用杜立特方法 我的代码: #include using namespace std; int main(){ do
我是一名优秀的程序员,十分优秀!