Towel: فصول مخصصة للمصفوفات؟

تم إنشاؤها على ٨ يوليو ٢٠٢٠  ·  4تعليقات  ·  مصدر: ZacharyPatten/Towel

أعلم أنه يمكنك استخدام الفئات المحددة بواسطة المستخدم للمصفوفات ، لكن لا يمكنني المرور بها. لنفترض أنني أريد تنفيذ تعويمي:

public class MyFloat
{
    private float value;
    public MyFloat(float value)
    {
        this.value = value;
    }

    public static MyFloat operator *(MyFloat a, MyFloat b) => new MyFloat(a.value * b.value);
    public static MyFloat operator +(MyFloat a, MyFloat b) => new MyFloat(a.value + b.value);
    public static MyFloat operator /(MyFloat a, MyFloat b) => new MyFloat(a.value / b.value);
    public static MyFloat operator -(MyFloat a, MyFloat b) => new MyFloat(a.value - b.value);
    public static MyFloat Zero => new MyFloat(0);
    public static implicit operator MyFloat(float a) => new MyFloat(a);
    public static implicit operator float(MyFloat a) => a.value;
    public static implicit operator MyFloat(int a) => new MyFloat(a); // this one is needed for Constant<T>.Zero
}

ثم أقوم بإنشاء مصفوفتين وحاول ضربهما

var a = new Matrix<MyFloat>(3, 5);
for (int i = 0; i < a.Rows; i++)
    for (int j = 0; j < a.Columns; j++)
        a[i, j] = 3;

var b = new Matrix<MyFloat>(5, 6);
for (int i = 0; i < b.Rows; i++)
    for (int j = 0; j < b.Columns; j++)
        b[i, j] = 5;

var c = a  * b;
Console.WriteLine(c);

وبعد ذلك توقف. أعتقد أنني أفتقد شيئًا ما ، لكن لم أتمكن من العثور عليه في المستندات أو العينات ، ولكن كيف أجعله يعمل؟

Bug

التعليق الأكثر فائدة

اسف على الجواب المتاخر. يبدو أن هناك مشكلة في الكود الخاص بي. إنه في الواقع ليس في كود المصفوفة ، إنه في طريقة ComputePi والتي تعمل حاليًا عندما أصل إلى فئة Constant<T> . من المحتمل أن يكون هذا حلًا سهلاً ، ومن المحتمل أن يكون الإصلاح جاهزًا بحلول الغد. :)

ما أحتاج إلى فعله هو إما إصلاح الحلقة اللانهائية التي تحدث في طريقة ComputePi أو أحتاج إلى منع حساب جميع الثوابت في فئة Constant<T> . على الرغم من أنني أقوم بالوصول إلى Constant<T>.Zero ، إلا أنه يحسب حاليًا Constant<T>.Pi نظرًا لأن جميع أعضاء هذه الفئة عبارة عن حقول ثابتة. لقد فعلت هذا في الأصل لأسباب تتعلق بالأداء.

شكرا لتقديم القضية. سأقوم بنشر هذه المشكلة مرة أخرى عندما يتم إصلاحها. :)

ال 4 كومينتر

اسف على الجواب المتاخر. يبدو أن هناك مشكلة في الكود الخاص بي. إنه في الواقع ليس في كود المصفوفة ، إنه في طريقة ComputePi والتي تعمل حاليًا عندما أصل إلى فئة Constant<T> . من المحتمل أن يكون هذا حلًا سهلاً ، ومن المحتمل أن يكون الإصلاح جاهزًا بحلول الغد. :)

ما أحتاج إلى فعله هو إما إصلاح الحلقة اللانهائية التي تحدث في طريقة ComputePi أو أحتاج إلى منع حساب جميع الثوابت في فئة Constant<T> . على الرغم من أنني أقوم بالوصول إلى Constant<T>.Zero ، إلا أنه يحسب حاليًا Constant<T>.Pi نظرًا لأن جميع أعضاء هذه الفئة عبارة عن حقول ثابتة. لقد فعلت هذا في الأصل لأسباب تتعلق بالأداء.

شكرا لتقديم القضية. سأقوم بنشر هذه المشكلة مرة أخرى عندما يتم إصلاحها. :)

لقد أصلحت المشكلة ، على الرغم من أنني أحتاج حاليًا إلى عدد قليل من المشغلين أكثر من المشغلين فقط في عينتك. جميع طرق الاختبار لمشروع Towel موجودة داخل مشروع Tools/Towel_Testing . لقد أضفت طريقة اختبار لعينتك هنا:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

يمكنك أن ترى أنني أضفت العوامل التالية:

public static bool operator <=(MyFloat a, MyFloat b) => a.value <= b.value;
public static bool operator >=(MyFloat a, MyFloat b) => a.value >= b.value;
public static bool operator ==(MyFloat a, MyFloat b) => a.value == b.value;
public static bool operator !=(MyFloat a, MyFloat b) => a.value != b.value;
public static MyFloat operator -(MyFloat a) => new MyFloat(-a.value);

بالنسبة لطريقة ComputePi ... لقد نسيت ++ متغيرًا ... لذا شكرًا لالتقاط ذلك. لا يزال هناك مجال للتحسين ، لكن هذا أدى إلى حل مشكلتك على الأقل. :) هنا كان السطر الذي نسيت ++ على: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

لم أقم بتحديث حزمة nuget اعتبارًا من هذا المنشور ، لكنني سأفعل ذلك في المستقبل القريب.

هل هناك إصلاح عاجل يمكنني جعله يعمل الآن؟ ربما يجب علي إضافة طريقة أو عامل آخر؟

أعتقد أنه تم إصلاح هذه المشكلة في PR # 54. إذا كانت لا تزال هناك مشكلة أو مشاكل أخرى ، فالرجاء إعادة فتح هذه المشكلة أو فتح مشكلة جديدة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات