فهرست تو در تو هنوز ماتریس معتبر نیست

یک فهرست می‌تواند چند سطر با طول‌های متفاوت داشته باشد؛ این ساختار به‌خودی‌خود ماتریس مستطیلی نیست. در پروژهٔ فعلی فقط ماتریس مربعی پذیرفته می‌شود، یعنی تعداد سطرها و طول هر سطر برابر است. مقدارهای داخل سطر عدد متناهی فرض شده‌اند. محدودکردن دامنه کمک می‌کند مفهوم محور و قطر اصلی را بدون درگیرشدن با همهٔ انواع دادهٔ عددی یاد بگیریم.

شکل داده را قبل از محاسبه بسنجید

اگر تعداد سطرها n باشد، طول هر سطر نیز باید n باشد. برای ساختار غیرمربعی خروجی خطای مشخص برمی‌گردد و محاسبه ادامه نمی‌یابد. استفاده از zip برای ستون‌ها بدون بررسی شکل می‌تواند سطر بلندتر را بی‌صدا کوتاه کند؛ این رفتار در بعضی کاربردها مفید است اما اعتبارسنجی ماتریس محسوب نمی‌شود. خطای ساختار باید پیش از تولید عدد ظاهراً معتبر آشکار شود.

جمع سطر و ستون دو پیمایش متفاوت است

جمع سطر یعنی برای هر فهرست داخلی sum بگیرید. برای جمع ستون i باید عنصر i همهٔ سطرها را جمع کنید. مخلوط‌کردن اندیس سطر و ستون در ماتریس‌های متقارن ممکن است پنهان بماند، پس نمونهٔ آزمون را نامتقارن انتخاب کنید. اگر همهٔ عناصر برابر باشند، بسیاری از خطاهای اندیسی خروجی ظاهراً درست می‌سازند و تست قدرت تشخیص کمی دارد.

قطر اصلی با جمع کل فرق دارد

قطر اصلی خانه‌هایی است که اندیس سطر و ستون برابرند؛ در ماتریس مربعی، عناصر matrix[i][i] را جمع می‌کنیم. این مقدار با قطر فرعی یا مجموع همهٔ خانه‌ها یکی نیست. در ماتریس یک‌در‌یک، جمع سطر، ستون و قطر برابر است و به‌تنهایی تست کافی نیست. برای تشخیص اشتباه قطر، نمونه‌ای بسازید که مقادیر قطر اصلی و فرعی متفاوت باشند.

معنای ماتریس خالی

در قرارداد آموزشی، ماتریس خالی معتبر است و خروجی شامل دو فهرست خالی و قطر صفر می‌شود. این تصمیم از رفتار جمع روی دنبالهٔ خالی پیروی می‌کند. بعضی کاربردهای جبر خطی ممکن است دادهٔ غیرخالی بخواهند؛ آن الزام باید صریح اضافه شود. نبودن ورودی یا null را با ماتریس خالی یکی نکنید، چون شکل و معنای آن‌ها متفاوت است.

ناورداهای مفید برای آزمون

مجموع جمع‌های سطری باید با مجموع جمع‌های ستونی برابر باشد، چون هر دو همهٔ خانه‌ها را یک بار می‌شمارند. ترانهاده‌کردن ماتریس، خروجی سطر و ستون را جابه‌جا می‌کند ولی مجموع قطر اصلی ثابت می‌ماند. این رابطه‌ها تست‌های خوبی برای کشف خطای محورند. بااین‌حال علاوه بر رابطه، یک نمونه با پاسخ دستی لازم است تا دو خروجی اشتباه ولی برابر از آزمون عبور نکنند.

چه زمانی NumPy مناسب‌تر است؟

برای دادهٔ کوچک، فهرست تو در تو مفهوم اندیس را آشکار و تمرین را مستقل از کتابخانه می‌کند. در محاسبات بزرگ و برداری، NumPy هم خواناتر و هم مناسب‌تر است، اما انتخاب axis هنوز باید درست باشد. axis را با حدس حفظ نکنید؛ شکل خروجی و نمونهٔ کوچک را بررسی کنید. برای توسعه، ابتدا ماتریس مستطیلی را بپذیرید و تعریف قطر و خطاهای شکل را دوباره بنویسید.

نمونه‌کد و قرارداد پروژه

matrix: فهرست سطرهای عددی؛ ماتریس باید مربعی باشد. ماتریس خالی معتبر است؛ سطرها همگی فهرست و مقدارها عدد متناهی‌اند.

row_sums و column_sums: جمع هر محور؛ diagonal: مجموع قطر اصلی. شکل غیرمربعی: فقط error=invalid_matrix. خالی: دو فهرست خالی و قطر صفر.

def solve(data):
    matrix = data['matrix']
    size = len(matrix)
    if any(len(row) != size for row in matrix):
        return {'error': 'invalid_matrix'}
    return {'row_sums': [sum(row) for row in matrix],
            'column_sums': [sum(row[i] for row in matrix) for i in range(size)],
            'diagonal': sum(matrix[i][i] for i in range(size))}

print(solve({'matrix': [[1, 2], [3, 4]]}))

خروجی مورد انتظار

{
  "row_sums": [
    3,
    7
  ],
  "column_sums": [
    4,
    6
  ],
  "diagonal": 5
}

پرسش‌های متداول

آیا zip شکل نامنظم را خطا می‌دهد؟

در حالت عادی تا کوتاه‌ترین ورودی پیش می‌رود و ممکن است داده را حذف کند؛ شکل سطرها را پیش از محاسبه بررسی کنید.

آیا قطر اصلی فقط برای مربع تعریف دارد؟

می‌توان برای ماتریس مستطیلی نیز تعریف کرد، اما این پروژه عمداً ورودی را به شکل مربعی محدود کرده است.

تمرین عملی و قدم بعدی

پروژهٔ «خلاصهٔ ماتریس عددی» همین قرارداد را در میزکار ارزیابی می‌کند. ابتدا خروجی نمونه را دستی محاسبه کنید، سپس تابع را اجرا کنید و یک ورودی مرزی متفاوت بسازید. نمونه‌کد راهی برای توضیح منطق است؛ برای یادگیری، علت هر شرط و انتخاب ساختار داده را بدون نگاه‌کردن به کد توضیح دهید. اجرای موفق با قبولی ارزیابی متفاوت است؛ نتیجه باید برای تمام حالت‌های تعریف‌شده درست بماند.

منابع و مطالعهٔ بیشتر

برای بررسی جزئیات و ادامهٔ مطالعه؛ متن این راهنما مستقلاً برای نوونتیکس نوشته شده است.