- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想计算矩阵的 LU 分解并从中提取线性组合。
我首先使用库 Armadillo 问了一个问题 here但正如一条评论所指出的, Armadillo 无法处理模数计算。
因此我开始从头开发一个使用质数模数的逻辑单元,这是我得到的,但仍然有一个我看不到的错误。
这是我目前拥有的代码。 (不要对 Matrix 类考虑太多,它只是目前封装 vector<vector<int>>
的一种方式。
Matrix* Matrix::triangulation(Matrix & ident)
{
unsigned int n = getNbLines();
unsigned int m = getNbColumns();
vector<vector<int>> mat = getMat();
vector<vector<int>> identity = ident.getMat();
vector<vector<int>> lower;
vector<vector<int>> upper;
/* ------------------------------------------------------------ */
/**
* @brief
* This code initialize a 'lower' matrix of size 'n x n'.
* The matrix is fill with only '0'.
*/
for(unsigned int i = 0; i < n; i++) {
vector<int> v(m);
lower.push_back(v);
for(unsigned int j = 0; j < m; j++) lower[i][j] = 0;
}
/**
* @brief
* This code initialize an 'upper' matrix of size 'n x m'.
* The matrix is fill with only '0'.
*/
for(unsigned int i = 0; i < n; i++) {
vector<int> v(m);
upper.push_back(v);
for(unsigned int j = 0; j < m; j++) upper[i][j] = 0;
}
/**
* @brief
* This code initialize an 'identity' matrix of size 'm x m'.
* The matrix is fill with only '0'.
*/
for(unsigned int i = 0; i < m; i++) {
vector<int> v2(m);
identity.push_back(v2);
for(unsigned int j = 0; j < m; j++) identity[i][j] = 0;
identity[i][i] = 1;
}
/* ------------------------------------------------------------ */
// Decomposing matrix into Upper and Lower triangular matrix
for (unsigned int i = 0; i < n; i++) {
// Upper Triangular
for (unsigned int k = 0; k < m; k++) {
// Summation of L(i, j) * U(j, k)
int sum = 0;
for (unsigned int j = 0; j < n; j++)
sum = sum + ((lower[i][j] * upper[j][k]));
// Evaluating U(i, k)
upper[i][k] = (mat[i][k] - sum) % prime;
identity[i][k] = (mat[i][k] - sum) % prime;
}
// Lower Triangular
for (unsigned int k = 0; k < n; k++) {
if (i == k) {
lower[i][i] = 1; // Diagonal as 1
}
else {
// Summation of L(k, j) * U(j, i)
int sum = 0;
for (unsigned int j = 0; j < n; j++)
sum = sum + ((lower[k][j] * upper[j][i]));
// Evaluating L(k, i)
lower[k][i] = (((mat[k][i] - sum)) / upper[i][i]) % prime;
identity[k][i] = (((mat[k][i] - sum)) / upper[i][i]) % prime;
}
}
}
ident.setMat(identity);
return new Matrix(lower,prime);
}
我用对象调用它:Matrix mat({ { 2, 1, 3, 2, 0}, { 4, 3, 0, 1, 1 }},5);
所以基本上,我想要 LU 分解(尤其是下三角矩阵),所有计算都在模数 5 中完成。
它可以提取下矩阵,但是,线性组合(这只是对单位矩阵执行的所有操作)不正确。这是我对我想要获得的东西的解释的痕迹:
c |-------------------------------------------------------------------------------------------------------|
c | Prime Number: 5
c |-------------------------------------------------------------------------------------------------------|
c | Input Matrix:
2 1 3 2 0
4 3 0 1 1
c |-------------------------------------------------------------------------------------------------------|
c | Lower Matrix:
1 0 0 0 0
2 1 0 0 0
c |-------------------------------------------------------------------------------------------------------|
c | Linear Combination Matrix:
2 0 3 2 0
0 1 0 3 1
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
c |-------------------------------------------------------------------------------------------------------|
c | Expected Solution:
3 2 3 0 3
0 1 1 3 4
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
c |-------------------------------------------------------------------------------------------------------|
c | Explanations:
c | 3 * c1 + 0 * c2 + 0 * c3 + 0 * c4 + 0 * c5 = c1 of Lower-Matrix
c | 2 * c1 + 1 * c2 + 0 * c3 + 0 * c4 + 0 * c5 = c2 of Lower-Matrix
c | 3 * c1 + 1 * c2 + 1 * c3 + 0 * c4 + 0 * c5 = c3 of Lower-Matrix
c | 0 * c1 + 3 * c2 + 0 * c3 + 1 * c4 + 0 * c5 = c4 of Lower-Matrix
c | 3 * c1 + 4 * c2 + 0 * c3 + 0 * c4 + 1 * c5 = c5 of Lower-Matrix
c +=======================================================================================================+
所以作为一个小总结:
问题:我在单位矩阵上应用修改的方法中的错误在哪里,为什么我没有输出正确的线性组合?
编辑
清楚地了解正常情况下应该发生什么。但是我做的算法(LU 分解)并不完全是我手工做的,即使它应该导致相同的结果。这才是真正的麻烦...
最佳答案
让我们把我的评论放到一个实际的答案中:虽然加法和乘法模素数会做你期望的事情(注意下面),但减法有一个陷阱,模数会为负输入返回负结果(例如 (-3)%5 = = -3) 而对于除法,您不能只使用整数除法,您必须实际实现乘法的逆运算(有关提示,请参阅 Demosthenes 在上一个链接问题中的回答)。
注意:除非你溢出,如果 prime*prime > INT_MAX ,你也有乘法的麻烦
关于c++ - 模数中的线性组合 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52648687/
在我的 previous question ,已经确定,当纹理四边形时,面部被分解为三角形,纹理坐标以仿射方式插值。 不幸的是,我不知道如何解决这个问题。 provided link很有用,但没有达到
是否有简单的解决方案可以在 Qt 中为图像添加运动模糊?还没有找到任何关于模糊的好教程。我需要一些非常简单的东西,我可以理解,如果我可以改变模糊角度,那就太好了。 最佳答案 Qt 没有运动模糊过滤器。
我想构建一个有点复杂的轴,它可以处理线性数据到像素位置,直到某个值,在该值中所有内容都被归入一个类别,因此具有相同的数据到像素值。例如,考虑具有以下刻度线的 y 轴: 0%, 10%, 20%, 30
我需要确保两个 View 元素彼此相邻且垂直高度相同。我会使用基线约束来做到这一点,但目前我正在使用线性、可滚动的布局( ScrollView 中的线性布局),当我点击一个元素时,它不允许我从中获取基
考虑正则表达式 ".*?\s*$" 和一个不以空格结尾的字符串。 示例 " a" .最后\s永远无法匹配 a这就是为什么 匹配器迭代: \s\s\s\s\s - fails .\s\s\
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我正在尝试阅读英特尔软件开发人员手册以了解操作系统的工作原理,这四个寻址术语让我感到困惑。以上是我的理解,如有不对请指正。 线性地址 : 对一个孤立的程序来说,似乎是一长串以地址0开头的内存。该程序的
有很多方法可以使用正则表达式并相应地使用匹配/测试匹配来检查字符串是否有效。我正在检查包含字母(a-b)、运算符(+、-、/、*)、仅特殊字符(如(')'、'(')和数字(0-9)的表达式是否有效 我
我正在使用 iris 数据集在 R 中练习 SVM,我想从我的模型中获取特征权重/系数,但我想我可能误解了一些东西,因为我的输出给了我 32 个支持向量。假设我要分析四个变量,我会得到四个。我知道在使
我正在使用 iris 数据集在 R 中练习 SVM,我想从我的模型中获取特征权重/系数,但我想我可能误解了一些东西,因为我的输出给了我 32 个支持向量。假设我要分析四个变量,我会得到四个。我知道在使
如何向左或向右滑动线性布局。在该线性布局中,默认情况下我有一个不可见的删除按钮,还有一些其他小部件,它们都是可见状态,当向左滑动线性布局时,我需要使其可见的删除按钮,当向右滑动时,我需要隐藏该删除按钮
我正在编写一个 R 脚本,运行时会给出因变量的预测值。我的所有变量都被分类(如图所示)并分配了一个编号,总类数为101。(每个类是歌曲名称)。 所以我有一个训练数据集,其中包含 {(2,5,6,1)8
如果源栅格位于 linear RGB color space使用以下 Java 代码进行转换,应用过滤器时(最后一行)会引发 java.awt.image.ImagingOpException: Un
我想为我的多个 UIImageView 设置动画,使其从 A 点线性移动到 B 点。 我正在使用 options:UIViewAnimationOptionCurveLinear - Apple 文档
我第一次无法使用 CSS3 创建好看的渐变效果。右侧应该有从黑色到透明的渐变透明渐变。底部是页脚,所以它需要在底部另外淡化为透明。 如果可能的话,一个例子: 页面的背景是一张图片,所以不可能有非透明淡
我有一组线性代数方程,Ax=By。其中A是36x20的矩阵,x是20x1的 vector ,B是36x13,y是13x1。 排名(A)=20。因为系统是超定的,所以最小二乘解是可能的,即; x = (
我有一个带有年月数据列(yyyymm)的 Pandas 数据框。我计划将数据插入每日和每周值。下面是我的 df。 df: 201301 201302 201303
假设我想找到2条任意高维直线的“交点”。这两条线实际上不会相交,但我仍然想找到最相交的点(即尽可能靠近所有线的点)。 假设这些线有方向向量A、B和初始点C、D,我可以通过简单地设置一个线性最小二乘问题
如果我想编写一个函数(可能也是一个类),它从不可变的查找表(调用构造函数时固定)返回线性“平滑”数据,如下所示: 例如func(5.0) == 0.5。 存储查找表的最佳方式是什么? 我正在考虑使用两
给定一条线 X像素长如: 0-------|---V---|-------|-------|-------max 如果0 <= V <= max , 线性刻度 V位置将是 X/max*V像素。 如何计
我是一名优秀的程序员,十分优秀!