اجرای عملیات ماتریسی پیشرفته در SQL Server با توابع سفارشی
برای ایجاد یک ماشین حساب ماتریس کارآمد در SQL Server، ابتدا باید ساختار دادهای مناسبی برای ذخیره ماتریسها تعریف کنیم. این امر با ایجاد یک جدول آغاز میشود که قادر به نگهداری مقادیر ماتریسها به همراه اطلاعات ابعادی آنها باشد.
ایجاد جدول برای ماتریسها:
ابتدا جدولی برای ذخیره عناصر ماتریس ایجاد میکنیم. این جدول شامل ستونهایی برای نام ماتریس، شماره سطر، شماره ستون و مقدار مربوطه خواهد بود.
CREATE TABLE dbo.Matrix (
MatrixName VARCHAR(50),
RowNumber INT,
ColumnNumber INT,
Value DECIMAL(18, 4)
);
وارد کردن دادههای نمونه:
سپس، دادههای نمونه را برای ماتریسهای مختلف وارد جدول میکنیم تا بتوانیم عملیات را روی آنها تست کنیم. در اینجا، دو ماتریس A و B را با ابعاد و مقادیر مشخص وارد میکنیم.
INSERT INTO dbo.Matrix (MatrixName, RowNumber, ColumnNumber, Value) VALUES
('A', 1, 1, 10), ('A', 1, 2, 20), ('A', 1, 3, 30),
('A', 2, 1, 40), ('A', 2, 2, 50), ('A', 2, 3, 60),
('B', 1, 1, 1), ('B', 1, 2, 2), ('B', 1, 3, 3),
('B', 2, 1, 4), ('B', 2, 2, 5), ('B', 2, 3, 6),
('B', 3, 1, 7), ('B', 3, 2, 8), ('B', 3, 3, 9); -- Matrix B is 3x3 for multiplication
عملیات ضرب ماتریس:
برای ضرب دو ماتریس A و B، از یک تابع اسکالر استفاده میکنیم. این تابع از روش ضرب داخلی برای محاسبه هر عنصر ماتریس حاصل استفاده میکند. قانون ضرب ماتریس به این صورت است که هر عنصر در ماتریس حاصل (Cij) از جمع حاصلضرب عناصر سطر i از ماتریس اول در ستون j از ماتریس دوم بدست میآید.
(Cij = Σ Aik * Bkj)
کد تابع ضرب ماتریس به شرح زیر است:
CREATE FUNCTION dbo.MatrixMultiplication
(
@MatrixA VARCHAR(50),
@MatrixB VARCHAR(50)
)
RETURNS @ResultMatrix TABLE
(
RowNumber INT,
ColumnNumber INT,
Value DECIMAL(18, 4)
)
AS
BEGIN
INSERT INTO @ResultMatrix (RowNumber, ColumnNumber, Value)
SELECT
A.RowNumber,
B.ColumnNumber,
SUM(A.Value * B.Value) AS Value
FROM
dbo.Matrix A
INNER JOIN
dbo.Matrix B ON A.ColumnNumber = B.RowNumber
WHERE
A.MatrixName = @MatrixA AND B.MatrixName = @MatrixB
GROUP BY
A.RowNumber, B.ColumnNumber;
RETURN;
END;
عملیات جمع ماتریس:
جمع ماتریسها نیازمند این است که هر دو ماتریس دارای ابعاد یکسانی باشند. عملیات جمع، به صورت عنصر به عنصر انجام میشود؛ به این معنی که هر عنصر در ماتریس حاصل (Cij) برابر با جمع عنصر متناظر آن در ماتریس A (Aij) و ماتریس B (Bij) است.
(Cij = Aij + Bij)
کد تابع جمع ماتریس به شرح زیر است:
CREATE FUNCTION dbo.MatrixAddition
(
@MatrixA VARCHAR(50),
@MatrixB VARCHAR(50)
)
RETURNS @ResultMatrix TABLE
(
RowNumber INT,
ColumnNumber INT,
Value DECIMAL(18, 4)
)
AS
BEGIN
INSERT INTO @ResultMatrix (RowNumber, ColumnNumber, Value)
SELECT
A.RowNumber,
A.ColumnNumber,
A.Value + B.Value AS Value
FROM
dbo.Matrix A
INNER JOIN
dbo.Matrix B ON A.RowNumber = B.RowNumber AND A.ColumnNumber = B.ColumnNumber
WHERE
A.MatrixName = @MatrixA AND B.MatrixName = @MatrixB;
RETURN;
END;
عملیات تفریق ماتریس:
مشابه جمع ماتریس، تفریق ماتریس نیز نیازمند ابعاد یکسان بین دو ماتریس است و به صورت عنصر به عنصر انجام میشود. هر عنصر در ماتریس حاصل (Cij) از تفریق عنصر متناظر در ماتریس B (Bij) از عنصر متناظر در ماتریس A (Aij) بدست میآید.
(Cij = Aij – Bij)
کد تابع تفریق ماتریس به شرح زیر است:
CREATE FUNCTION dbo.MatrixSubtraction
(
@MatrixA VARCHAR(50),
@MatrixB VARCHAR(50)
)
RETURNS @ResultMatrix TABLE
(
RowNumber INT,
ColumnNumber INT,
Value DECIMAL(18, 4)
)
AS
BEGIN
INSERT INTO @ResultMatrix (RowNumber, ColumnNumber, Value)
SELECT
A.RowNumber,
A.ColumnNumber,
A.Value - B.Value AS Value
FROM
dbo.Matrix A
INNER JOIN
dbo.Matrix B ON A.RowNumber = B.RowNumber AND A.ColumnNumber = B.ColumnNumber
WHERE
A.MatrixName = @MatrixA AND B.MatrixName = @MatrixB;
RETURN;
END;
عملیات تقسیم ماتریس (عنصر به عنصر):
در این بخش، تقسیم ماتریس به صورت عنصر به عنصر پیادهسازی میشود، یعنی هر عنصر در ماتریس حاصل (Cij) برابر با تقسیم عنصر متناظر آن در ماتریس A (Aij) بر عنصر متناظر در ماتریس B (Bij) است. توجه داشته باشید که این تقسیم با تقسیم ماتریس به معنای ریاضی کامل متفاوت است و تنها برای هر سلول به صورت مجزا عمل میکند.
(Cij = Aij / Bij)
کد تابع تقسیم ماتریس به شرح زیر است:
CREATE FUNCTION dbo.MatrixDivision
(
@MatrixA VARCHAR(50),
@MatrixB VARCHAR(50)
)
RETURNS @ResultMatrix TABLE
(
RowNumber INT,
ColumnNumber INT,
Value DECIMAL(18, 4)
)
AS
BEGIN
INSERT INTO @ResultMatrix (RowNumber, ColumnNumber, Value)
SELECT
A.RowNumber,
A.ColumnNumber,
CASE
WHEN B.Value = 0 THEN NULL -- Handle division by zero
ELSE A.Value / B.Value
END AS Value
FROM
dbo.Matrix A
INNER JOIN
dbo.Matrix B ON A.RowNumber = B.RowNumber AND A.ColumnNumber = B.ColumnNumber
WHERE
A.MatrixName = @MatrixA AND B.MatrixName = @MatrixB;
RETURN;
END;
مثالهای کاربردی:
پس از تعریف توابع، میتوانید آنها را برای انجام عملیات مختلف روی ماتریسها فراخوانی کنید. در اینجا چند مثال برای نمایش کاربرد این توابع آورده شده است:
مثال ۱: استفاده از تابع ضرب ماتریس
SELECT * FROM dbo.MatrixMultiplication('A', 'B');
مثال ۲: استفاده از تابع جمع ماتریس
برای تست جمع، تفریق و تقسیم عنصر به عنصر، نیاز است که ماتریس B ابعاد مشابه ماتریس A (یعنی 2×3) داشته باشد. برای این منظور، میتوانیم دادههای ماتریس B را موقتاً تغییر دهیم یا ماتریس B دیگری با ابعاد 2×3 تعریف کنیم. فرض میکنیم ماتریس B برای این عملیات نیز 2×3 است.
-- برای جمع، تفریق و تقسیم، ماتریسها باید ابعاد یکسانی داشته باشند.
-- اگر ماتریس B را به 2x3 تغییر دهیم، مثالها نتایج معناداری خواهند داشت:
-- INSERT INTO dbo.Matrix (MatrixName, RowNumber, ColumnNumber, Value) VALUES
-- ('B', 1, 1, 1), ('B', 1, 2, 2), ('B', 1, 3, 3),
-- ('B', 2, 1, 4), ('B', 2, 2, 5), ('B', 2, 3, 6);
SELECT * FROM dbo.MatrixAddition('A', 'B');
مثال ۳: استفاده از تابع تفریق ماتریس
SELECT * FROM dbo.MatrixSubtraction('A', 'B');
مثال ۴: استفاده از تابع تقسیم ماتریس
SELECT * FROM dbo.MatrixDivision('A', 'B');