Я пытаюсь создать матрицу 2x2 из двух 2D-массивов, содержащих значения в C. Создаваемая матрица с именем перекрытия и представляет собой матрицу 2x2, имеющую элементы, которые являются функциями каждого массива D и A. Я написал следующий код, и его вывод показан ниже. Я не знаю, что делаю не так, и мне было интересно, сможет ли тот, кто это читает, помочь заблудшему новому ученику C. P.S. Я знаю, что могу явно записать каждый элемент, а затем поместить его в матрицу без использования массива; однако я планирую использовать этот скелет в качестве основы для кода автоматизации вычислений для более крупных входных данных.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define BASISFUN 2
#define PI 3.14159265358979323846
void overlaps(double overlap[][2], double d[][2], double a[][2]) {
printf("\nThe Overlap Matrix is\n");
for (int i = 0; i < BASISFUN; i++) {
for (int j = 0; j < BASISFUN; j++) {
overlap[i][j] = 0.0;
if (i == j && i == 0) {
overlap[0][0] =
pow(d[0][0], 2.0) * pow((PI / (a[0][0] + a[0][0])), 1.5);
} else if (i == j && i == 1) {
overlap[1][1] =
pow(d[1][1], 2.0) * pow((PI / (a[1][1] + a[1][1])), 1.5);
} else if (i != j && i == 1) {
overlap[1][0] =
pow(d[1][0], 2.0) * pow((PI / (a[1][0] + a[1][0])), 1.5);
} else {
overlap[0][1] =
pow(d[0][1], 2.0) * pow((PI / (a[0][1] + a[0][1])), 1.5);
}
printf("%.4f\t", overlap[i][j]);
}
printf("\n");
}
}
int main() {
double A1 = 0.532149;
double A2 = 4.097728;
double D1 = 0.82559;
double D2 = 0.28317;
double a[1][2] = {A1, A2};
double d[1][2] = {D1, D2};
double overlap[2][2];
overlaps(overlap, d, a);
return 0;
}
ВЫХОД: Матрица орбитальных коэффициентов
3.4567 0.0190
3.6998 44.0676
Однако при использовании Matlab продукт должен выглядеть следующим образом, что на 100% верно:
3.4567 0.1307
0.1307 0.0190
Нет a[1][1]
. Вы определили «a» как double a[1][2]
, поэтому единственное допустимое значение для первого индекса — 0. Аналогично, d[1][0]
не существует. Это тоже выход за пределы. Индексы массива изменяются от 0 до объявленного размера — 1.
Думаю, мне нужна была новая пара глаз. Когда дело касается матриц и массивов, это немного сбивает с толку назначение индексов. Большое спасибо за вашу помощь - Мо
Размеры a
и d
и расчеты overlap
неверны:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define BASISFUN 2
#define PI 3.14159265358979323846
void overlaps(double overlap[][BASISFUN], double d[][BASISFUN], double a[][BASISFUN])
{
overlap[0][0] = pow(d[0][0], 2.0) * pow((PI / (a[0][0] + a[0][0])), 1.5);
overlap[0][1] = d[0][0] * d[0][1] * pow((PI / (a[0][0] + a[0][1])), 1.5);
overlap[1][0] = d[1][0] * d[1][1] * pow((PI / (a[1][0] + a[1][1])), 1.5);
overlap[1][1] = pow(d[1][1], 2.0) * pow((PI / (a[1][1] + a[1][1])), 1.5);
printf("The Overlap Matrix is:\n");
for (int i = 0; i < BASISFUN; i++)
{
for (int j = 0; j < BASISFUN; j++)
{
printf("%.8f\t", overlap[i][j]);
}
printf("\n");
}
}
int main()
{
double A1 = 0.532149, A2 = 4.097728, D1 = 0.82559, D2 = 0.28317;
double a[BASISFUN][BASISFUN] = {{A1, A2}, {A1, A2}};
double d[BASISFUN][BASISFUN] = {{D1, D2}, {D1, D2}};
double overlap[BASISFUN][BASISFUN];
overlaps(overlap, d, a);
return 0;
}
The Overlap Matrix is:
3.45667690 0.13067193
0.13067193 0.01903091
Для улучшения согласованности рекомендуется заменить 2
на BASISFUN
в нескольких (возможно, во всех) местах. – chux – Восстановить Монику
Вы также можете использовать long double
, если необходимо, и переписать петли на основе правильного расчета overlap
.
Вы можете расширить его до более высоких измерений, просто присвоив правильные значения A[BASISFUN]
и D[BASISFUN]
и соответствующим образом изменив циклы:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define BASISFUN 6
#define PI 3.14159265358979323846
void overlaps(
double overlap[][BASISFUN],
double d[][BASISFUN],
double a[][BASISFUN])
{
for (int i = 0; i < BASISFUN; i++)
{
overlap[i][i] = pow(d[i][i], 2.0) * pow((PI / (a[i][i] + a[i][i])), 1.5);
}
for (int i = 0; i < BASISFUN; i++)
{
for (int j = 0; j < BASISFUN; j++)
{
if (i != j)
{
overlap[i][j] =
d[i][j] * d[j][i] * pow((PI / (a[i][j] + a[j][i])), 1.5);
}
}
}
printf("The Overlap Matrix is:\n");
for (int i = 0; i < BASISFUN; i++)
{
for (int j = 0; j < BASISFUN; j++)
{
printf("%.8f\t", overlap[i][j]);
}
printf("\n");
}
}
int main()
{
double a[BASISFUN][BASISFUN];
double d[BASISFUN][BASISFUN];
double A[BASISFUN] = {0.532149, 4.097728, 0.00001, 0.00001, 0.00001, 0.00001};
double D[BASISFUN] = {0.82559, 0.28317, 0.00001, 0.00001, 0.00001, 0.00001};
for (int i = 0; i < BASISFUN; i++)
{
for (int j = 0; j < BASISFUN; j++)
{
a[i][j] = A[j];
d[i][j] = D[j];
}
}
double overlap[BASISFUN][BASISFUN];
overlaps(overlap, d, a);
return 0;
}
The Overlap Matrix is:
3.45667690 0.13067193 0.00011842 0.00011842 0.00011842 0.00011842
0.13067193 0.01903091 0.00000190 0.00000190 0.00000190 0.00000190
0.00011842 0.00000190 0.00622558 0.00622558 0.00622558 0.00622558
0.00011842 0.00000190 0.00622558 0.00622558 0.00622558 0.00622558
0.00011842 0.00000190 0.00622558 0.00622558 0.00622558 0.00622558
0.00011842 0.00000190 0.00622558 0.00622558 0.00622558 0.00622558
Для улучшения согласованности рекомендуется заменить 2
на BASISFUN
в нескольких (возможно, во всех) местах.
Огромное спасибо, Моника. Я надеялся включить это в общий код, где появилась возможность использования динамических массивов и, я не знаю, правильна ли терминология, динамических матриц для проблем со значительно большим количеством значений «d» или «a» из некоторого выходного файла. Еще надо поработать над этой идеей. Мне нравится идея преобразования массивов в матрицы с равномерными результатами; однако я воздержался от этого, поскольку в реальных жизненных ситуациях эти значения не обязательно образуют простую матрицу. Есть какие-нибудь предложения по моей расширенной идее?
Я не знаю, что сказать, кроме того, что мне нравится логика вашего кода — я не знаю, почему я не подумал об этом раньше. Я снимаю перед тобой шляпу - шляпу снимают
Последовательные отступы могут превратить нечитаемый беспорядок в понятный код...