اجرای عملیات ماتریسی پیشرفته در SQL Server با توابع سفارشی

اجرای عملیات ماتریسی پیشرفته در 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');

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟