Проверка идентичности двух матриц в C++, Python, JavaScript и C

Задача
Вам даны две матрицы mat1[][] и mat2[][]. Нужно определить, идентичны ли они. Матрицы считаются идентичными, если:
- одинаковое количество строк и столбцов;
- все соответствующие элементы равны.
Если матрицы идентичны, вывести “Yes, the matrices are identical”. Если нет — вывести “No, the matrices are not identical”.
Условия идентичности матриц
- Равенство размеров: число строк и столбцов совпадают.
- Равенство всех соответствующих элементов: для любого индекса (i, j) mat1[i][j] == mat2[i][j].
Подход
Общий, надёжный и простой алгоритм:
- Сначала проверить размеры (быстрая отбраковка).
- Пройти по всем элементам в двух вложенных циклах (строки и столбцы).
- Если найдётся пара элементов, которые не равны — матрицы не идентичны.
- Если цикл завершился без различий — матрицы идентичны.
Сложность: O(rows · cols) по времени, O(1) дополнительной памяти (если не считать самих матриц).
Важно: для чисел с плавающей точкой вместо прямого сравнения используйте сравнение с эпсилон (|a-b| < eps).
Реализация и примеры кода
В следующих разделах приведены примеры на C++, Python, JavaScript и C. Код в примерах демонстрирует предложенный подход: проверка соответствующих элементов.
C++
Ниже — оригинальная программа на C++ для проверки идентичности матриц:
// C++ program to check if two matrices are identical
#include
using namespace std;
// The order of the matrix is 3 x 4
#define size1 3
#define size2 4
// Function to check if two matrices are identical
bool isIdentical(int mat1[][size2], int mat2[][size2])
{
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
if (mat1[i][j] != mat2[i][j])
{
return false;
}
}
}
return true;
}
// Function to print a matrix
void printMatrix(int mat[][size2])
{
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
cout << mat[i][j] << " ";
}
cout << endl;
}
}
// Driver code
int main()
{
// 1st Matrix
int mat1[size1][size2] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{2, 2, 2, 2} };
cout << "Matrix 1:" << endl;
printMatrix(mat1);
// 2nd Matrix
int mat2[size1][size2] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{2, 2, 2, 2} };
cout << "Matrix 2:" << endl;
printMatrix(mat2);
if(isIdentical(mat1, mat2))
{
cout << "Yes, the matrices are identical" << endl;
}
else
{
cout << "No, the matrices are not identical" << endl;
}
// 3rd Matrix
int mat3[size1][size2] = { {3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3} };
cout << "Matrix 3:" << endl;
printMatrix(mat3);
// 4th Matrix
int mat4[size1][size2] = { {4, 4, 4, 4},
{4, 4, 4, 4},
{4, 4, 4, 4} };
cout << "Matrix 4:" << endl;
printMatrix(mat4);
if(isIdentical(mat3, mat4))
{
cout << "Yes, the matrices are identical" << endl;
}
else
{
cout << "No, the matrices are not identical" << endl;
}
return 0;
} Выход программы:
Matrix 1:
2 2 2 2
2 2 2 2
2 2 2 2
Matrix 2:
2 2 2 2
2 2 2 2
2 2 2 2
Yes, the matrices are identical
Matrix 3:
3 3 3 3
3 3 3 3
3 3 3 3
Matrix 4:
4 4 4 4
4 4 4 4
4 4 4 4
No, the matrices are not identicalPython
Оригинальная программа на Python:
# Python program to check if two matrices are identical
# The order of the matrix is 3 x 4
size1 = 3
size2 = 4
# Function to check if two matrices are identical
def isIdentical(mat1, mat2):
for i in range(size1):
for j in range(size2):
if (mat1[i][j] != mat2[i][j]):
return False
return True
# Function to print a matrix
def printMatrix(mat):
for i in range(size1):
for j in range(size2):
print(mat[i][j], end=' ')
print()
# Driver code
# 1st Matrix
mat1 = [ [2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2] ]
print("Matrix 1:")
printMatrix(mat1)
# 2nd Matrix
mat2 = [ [2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2] ]
print("Matrix 2:")
printMatrix(mat2)
if (isIdentical(mat1, mat2)):
print("Yes, the matrices are identical")
else:
print("No, the matrices are not identical")
# 3rd Matrix
mat3 = [ [3, 3, 3, 3],
[3, 3, 3, 3],
[3, 3, 3, 3] ]
print("Matrix 3:")
printMatrix(mat3)
# 4th Matrix
mat4 = [ [4, 4, 4, 4],
[4, 4, 4, 4],
[4, 4, 4, 4] ]
print("Matrix 4:")
printMatrix(mat4)
if (isIdentical(mat3, mat4)):
print("Yes, the matrices are identical")
else:
print("No, the matrices are not identical")
Выход аналогичен примерам выше.
Примечание: в Python для числовых матриц можно использовать numpy.array_equal(mat1, mat2) — это будет компактнее и оптимизировано.
JavaScript
Оригинальная программа на JavaScript:
// JavaScript program to check if two matrices are identical
// The order of the matrix is 3 x 4
var size1 = 3;
var size2 = 4;
// Function to check if two matrices are identical
function isIdentical(mat1, mat2) {
for (let i = 0; i < size1; i++)
{
for (let j = 0; j < size2; j++)
{
if (mat1[i][j] != mat2[i][j])
{
return false;
}
}
}
return true;
}
// Function to print a matrix
function printMatrix(mat) {
for (let i = 0; i < size1; i++) {
for (let j = 0; j < size2; j++) {
document.write(mat[i][j] + " ");
}
document.write(" ");
}
}
// Driver code
// 1st Matrix
var mat1 = [ [2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2] ];
document.write("Matrix 1:" + " ");
printMatrix(mat1);
// 2nd Matrix
var mat2 = [ [2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2] ];
document.write("Matrix 2:" + " ");
printMatrix(mat2);
if (isIdentical(mat1, mat2)) {
document.write("Yes, the matrices are identical" + " ");
} else{
document.write("No, the matrices are not identical" + " ");
}
// 3rd Matrix
var mat3 = [ [3, 3, 3, 3],
[3, 3, 3, 3],
[3, 3, 3, 3] ];
document.write("Matrix 3:" + " ");
printMatrix(mat3);
// 4th Matrix
var mat4 = [ [4, 4, 4, 4],
[4, 4, 4, 4],
[4, 4, 4, 4] ];
document.write("Matrix 4:" + " ");
printMatrix(mat4);
if (isIdentical(mat3, mat4)) {
document.write("Yes, the matrices are identical" + " ");
} else{
document.write("No, the matrices are not identical" + " ");
}В браузерной среде чаще используют консоль или DOM-методы для вывода. Для глубоких сравнений в Node.js можно сравнивать сериализованные строки JSON (для примера) или использовать специализированные сравнения.
C
Оригинальная программа на C:
// C program to check if two matrices are identical
#include
#include
// The order of the matrix is 3 x 4
#define size1 3
#define size2 4
// Function to check if two matrices are identical
bool isIdentical(int mat1[][size2], int mat2[][size2])
{
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
if (mat1[i][j] != mat2[i][j])
{
return false;
}
}
}
return true;
}
// Function to print a matrix
void printMatrix(int mat[][size2])
{
for (int i = 0; i < size1; i++)
{
for (int j = 0; j < size2; j++)
{
printf("%d ", mat[i][j]);
}
printf("\n");
}
}
// Driver code
int main()
{
// 1st Matrix
int mat1[size1][size2] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{2, 2, 2, 2} };
printf("Matrix 1:\n");
printMatrix(mat1);
// 2nd Matrix
int mat2[size1][size2] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{2, 2, 2, 2} };
printf("Matrix 2:\n");
printMatrix(mat2);
if(isIdentical(mat1, mat2))
{
printf("Yes, the matrices are identical \n");
}
else
{
printf("No, the matrices are not identical \n");
}
// 3rd Matrix
int mat3[size1][size2] = { {3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3} };
printf("Matrix 3: \n");
printMatrix(mat3);
// 4th Matrix
int mat4[size1][size2] = { {4, 4, 4, 4},
{4, 4, 4, 4},
{4, 4, 4, 4} };
printf("Matrix 4: \n");
printMatrix(mat4);
if(isIdentical(mat3, mat4))
{
printf("Yes, the matrices are identical \n");
}
else
{
printf("No, the matrices are not identical \n");
}
return 0;
} Альтернативные подходы
- Свернуть матрицы в одномерные массивы (flatten) и сравнить их функцией std::equal (C++), list comparison (Python) или сериализацией (JS). Это упрощает код, но требует аккуратности с форматом.
- Для больших матриц можно вычислять контрольные суммы или хеши строк/блоков и сравнивать их сначала по хешу, затем по элементам при совпадении хешей.
- Для NumPy: использовать numpy.array_equal — коротко и быстро.
- Для разреженных матриц (sparse) сравнивать структуру и ненулевые элементы, а не полный плотный перебор.
Когда предложенный метод не годится
- Числа с плавающей точкой: прямое сравнение может дать ложные результаты — используйте эпсилон.
- Очень большие матрицы, которые не помещаются в память: потоковая обработка или блочный хеш лучше.
- Разреженные представления: перебор всех ячеек будет неэффективен.
- Если нужна инвариантность к перестановкам строк/столбцов или к транспонированию — обычное сравнение не подойдёт.
Важно: всегда сначала проверяйте размеры. Это быстрая и простая отбраковка.
Факты и сложность
- Временная сложность: O(rows · cols).
- Память: O(1) дополнительной памяти (в сравнении с матрицами).
- Для разреженных матриц предпочтительна проверка структур и списков ненулевых элементов.
Критерии приёмки
- Два одинаковых массива одинаковых размеров → успешный проход, вывод “Yes…”.
- Матрицы разных размеров → сразу “No…”.
- Матрицы одинаковых размеров, различие в раннем элементе → быстрое прекращение работы и “No…”.
- Матрицы различаются только в последнем элементе → полный перебор и “No…”.
- Сравнение чисел с плавающей точкой должно учитывать eps.
Тест-кейсы (коротко)
- Малые матрицы 1×1: equal / not equal.
- Одинаковые матрицы 3×4 (как в примерах).
- Одинаковые размеры, различие в середине.
- Разные размеры: 2×3 vs 3×2.
- Плавающие числа: 0.1+0.2 против 0.3 с eps.
Чек-лист для разработчика
- Проверить, что размеры одинаковы.
- Выбрать подходящую стратегию сравнения (плотная / разреженная).
- Для float — установить значение eps и использовать сравнение по модулю.
- Добавить тесты: ранний выход, поздний выход, разные размеры.
- Проводить профилирование для больших матриц (при необходимости — перейти на блочный/параллельный алгоритм).
Короткий глоссарий
- Матрица — двумерная таблица чисел, индексируемая по строкам и столбцам.
- Идентичность матриц — совпадение размеров и всех соответствующих элементов.
- Эпсилон (eps) — допустимая погрешность при сравнении чисел с плавающей точкой.
Вывод
Проверка идентичности двух матриц — простая и надёжная операция: сначала сравнивают размеры, затем элементы в двух вложенных циклах. В большинстве практических случаев этого достаточно; для особых нужд (float, разреженные или очень большие матрицы) применяют адаптации: сравнение с эпсилон, хеширование или специальные представления.
Примечание: постоянно держите тесты для раннего и позднего расхождения — это помогает ловить ошибки в реализации.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone