От 2D-массивов к матрице 2x2 в C

Я пытаюсь создать матрицу 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

Последовательные отступы могут превратить нечитаемый беспорядок в понятный код...

Andrew Henle 03.07.2024 02:23

Нет a[1][1] . Вы определили «a» как double a[1][2], поэтому единственное допустимое значение для первого индекса — 0. Аналогично, d[1][0] не существует. Это тоже выход за пределы. Индексы массива изменяются от 0 до объявленного размера — 1.

Avi Berger 03.07.2024 02:25

Думаю, мне нужна была новая пара глаз. Когда дело касается матриц и массивов, это немного сбивает с толку назначение индексов. Большое спасибо за вашу помощь - Мо

Moe El 03.07.2024 03:35
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 в нескольких (возможно, во всех) местах.

chux - Reinstate Monica 03.07.2024 03:04

Огромное спасибо, Моника. Я надеялся включить это в общий код, где появилась возможность использования динамических массивов и, я не знаю, правильна ли терминология, динамических матриц для проблем со значительно большим количеством значений «d» или «a» из некоторого выходного файла. Еще надо поработать над этой идеей. Мне нравится идея преобразования массивов в матрицы с равномерными результатами; однако я воздержался от этого, поскольку в реальных жизненных ситуациях эти значения не обязательно образуют простую матрицу. Есть какие-нибудь предложения по моей расширенной идее?

Moe El 03.07.2024 03:59

Я не знаю, что сказать, кроме того, что мне нравится логика вашего кода — я не знаю, почему я не подумал об этом раньше. Я снимаю перед тобой шляпу - шляпу снимают

Moe El 03.07.2024 04:27

Другие вопросы по теме