我正在嘗試以數字方式計算總和:

我完全理解這是一個簡單的總數,但是,如果我做得正確,我的頭腦會因此持續幾天讓我感到刺痛。
這是我為計算它而撰寫的 C 代碼的概要:
struct vecs{
float x;
float y;
float z;
float a;
};
struct vector_file{
int id;
vector<vecs> VAL;
};
vector<vector_file> VEC;
I[10][10]={}
double absolute_val(double xi, double yi, double zi, double xj, double yj, double zj){
return(sqrt(pow(xi-xj,2) pow(yi-yj,2) pow(zi-zj,2)));
}
for (int i=0;i<VEC.size();i ){
for (int j=0;j<i;j ){
double integ=0;
for (int k=0;k<VEC[i].VAL.size();k ){
for (int l=0;l<VEC[j].VAL.size();l ){
integ =VEC[i].VAL[k].a*VEC[j].VAL[l].a/absolute_val(VEC[i].VAL[k].x,VEC[i].VAL[k].y,VEC[i].VAL[k].z,VEC[j].VAL[l].x,VEC[j].VAL[l].y, VEC[j].VAL[l].z);
}
}
I[i][j]=integ;
}
}
我只需要非對角元素,不需要矩陣的上三角部分,因為它類似于下三角部分。我已經檢查了多次,但是,仍然回頭想知道我是否做得正確。
非常感謝您花時間查看它。
uj5u.com熱心網友回復:
是的,你的代碼是正確的。如果你想讓它“更明顯”正確,我會通過定義一些輔助函式來使其更接近數學定義。
具體來說:
const vecs& R(int upper, int lower) { return VEC[upper].VAL[lower]; }
const float a(int upper, int lower) { return VEC[upper].VAL[lower].a; }
int num_vecs(int upper) { return VEC[upper].VAL.size(); }
接下來,我會寫信magnitude_diff接受兩個vecs. 它并不是嚴格意義上的量級,因為您只查看了四個分量中的三個,但我也不覺得定義operator -3/4 分量很舒服。
double magnitude_diff(const vecs& i, const vecs& j){
return sqrt(pow(i.x-j.x,2) pow(i.y-j.y,2) pow(i.z-j.z,2));
}
然后你的內部回圈與公式非常接近:
double integ=0;
for (int k=0; k < num_vecs(i); k ){
for (int l=0; l < num_vecs(j); l ){
integ = a(i, k) * a(j, l) / magnitude_diff(R(i, k), R(j, l));
}
}
I[i][j] = integ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367307.html
下一篇:如何寫出所有可能的組合
