我正在尝试在学校项目的代码中实施Gram Schmidt而且我有一个问题。它输出一个奇怪的数字,我不知道为什么。其余的都很好但是这个很糟糕。如果帖子很糟糕,但这是我在这里的第一篇帖子,我真的需要帮助。谢谢
package com.example.admin_u5214628.magiceight;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextSwitcher;
import android.widget.Toast;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
Random r = new Random();
static final String messages[] = {"Yes", "I would think so", "It is so", "No", "Not a chance", "Never", "maybe", "I would rather not say"};
TextSwitcher switcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
switcher = (TextSwitcher) findViewById(R.id.textSwitcher);
}
void answer(View v) {
String message = messages[r.nextInt(messages.length)];
switcher.setText(message);
}
}
输出:
#include <iostream>
#define dim 100
using namespace std;
void inputMatrix(int *n, int *m, double x[dim][dim]){
int i,j;
for(i = 0; i < *n; i++){
cout << "V" << i << ":";
for(j = 0; j < *m; j++)
cin >> x[i][j];
}
}
void outputMatrix(int *n, int *m, double x[dim][dim]){
int i,j;
for(i=0;i<*n;i++){
for(j=0;j<*m;j++)
cout<<x[i][j]<<" ";
cout<<endl;
}
}
void initialize(int *m,double v[dim]){
int i;
for(i=0;i<*m;i++){
v[i]=0;
}
}
int main(){
double v[dim][dim], f[dim][dim], e[dim][dim],p1,p2,a[dim];
int n,m,i,j,z;
cout << "Introduceti numarul de vectori: ";cin >> n;
cout << "Introduceti numarul de elemente: ";cin >> m;
inputMatrix(&n,&m,v);
double div = 0;
for(i = 0; i < m; i++){
f[0][i] = v[0][i];
}
outputMatrix(&n,&m,v);
cout << endl;
outputMatrix(&n,&m,f);
for(i = 1;i < n; i++){
z = 0;
initialize(&m,a);
mk1:
p1 = 0;
p2 = 0;
for(j = 0; j < m; j++){
p1 = f[z][j] * v[i][j] + p1;
p2 = f[z][j] * f[z][j] + p2;
}
div = p1 / p2;
for(j = 0; j < m; j++){
a[j] = f[z][j] * div + a[j];
}
z++;
if( z < i){
goto mk1;
}
else{
for(j = 0; j < m;j++){
f[i][j] = v[i][j] - a[j];
}
}
cout << endl;
outputMatrix(&n,&m,f);
return 0;
}
我不明白为什么输出这个“5.55112e-17” 谢谢你的帮助!
答案 0 :(得分:2)
我不明白为什么输出这个“5.55112e-17”感谢您的帮助!
这是舍入误差的结果,这种表示法意味着5.55112乘以10的幂,并且可以被认为是用(实数)计算机表示计算的伪像。有关详细说明,请考虑this回答。
答案 1 :(得分:2)
5.55112e-17
非常接近于零。由于您使用的数字二进制表示的数值分辨率(例如double
),它并不完全为零。
您可以使用更高的分辨率进行计算,而不是打印结果。 或者,您可以在最后进行舍入。然而,你无法摆脱数字。
这里有一些关于你的代码的其他评论:
std::vector
。这也使您可以使用动态内存分配(如果矩阵大于100,您的代码将崩溃)。 goto
。您可以在下面找到另一种实现方式。没有goto
的代码
int main() {
double v[dim][dim], f[dim][dim], e[dim][dim], p1, p2, a[dim];
int n, m, i, j, z;
cout << "Introduceti numarul de vectori: ";
cin >> n;
cout << "Introduceti numarul de elemente: ";
cin >> m;
inputMatrix(&n, &m, v);
double div = 0;
for (i = 0; i < m; i++) {
f[0][i] = v[0][i];
}
outputMatrix(&n, &m, v);
cout << endl;
outputMatrix(&n, &m, f);
for (i = 1; i < n; i++) {
z = 0;
initialize(&m, a);
do {
p1 = 0;
p2 = 0;
for (j = 0; j < m; j++) {
p1 = f[z][j] * v[i][j] + p1;
p2 = f[z][j] * f[z][j] + p2;
}
div = p1 / p2;
for (j = 0; j < m; j++) {
a[j] = f[z][j] * div + a[j];
}
z++;
} while (z < i);
for (j = 0; j < m; j++) {
f[i][j] = v[i][j] - a[j];
}
}
cout << endl;
outputMatrix(&n, &m, f);
return 0;
}