Towel: Kelas khusus untuk Matriks?

Dibuat pada 8 Jul 2020  ·  4Komentar  ·  Sumber: ZacharyPatten/Towel

Saya tahu Anda dapat menggunakan kelas yang ditentukan pengguna untuk matriks, tetapi saya tidak bisa melewatinya. Katakanlah saya ingin mengimplementasikan float saya:

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
}

Lalu saya membuat dua matriks dan mencoba mengalikannya

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);

Dan kemudian hang. Saya pikir saya kehilangan sesuatu, tetapi tidak dapat menemukannya di dokumen atau sampel, tetapi bagaimana cara membuatnya berfungsi?

Bug

Komentar yang paling membantu

Maaf untuk respon yang terlambat. Tampaknya ada masalah dalam kode saya. Itu sebenarnya tidak ada dalam kode Matrix, itu dalam metode ComputePi yang saat ini berjalan ketika saya mengakses kelas Constant<T> . Ini kemungkinan akan menjadi perbaikan yang mudah, dan saya mungkin akan menyiapkan perbaikannya besok. :)

Yang perlu saya lakukan adalah memperbaiki infinite loop yang terjadi di metode ComputePi atau saya perlu mencegah semua konstanta dihitung di kelas Constant<T> . Meskipun saya mengakses Constant<T>.Zero , saat ini juga menghitung Constant<T>.Pi karena semua anggota kelas itu adalah bidang statis. Saya awalnya melakukan ini karena alasan kinerja.

Terima kasih telah mengirimkan masalah. Saya akan memposting tentang masalah ini lagi ketika sudah diperbaiki. :)

Semua 4 komentar

Maaf untuk respon yang terlambat. Tampaknya ada masalah dalam kode saya. Itu sebenarnya tidak ada dalam kode Matrix, itu dalam metode ComputePi yang saat ini berjalan ketika saya mengakses kelas Constant<T> . Ini kemungkinan akan menjadi perbaikan yang mudah, dan saya mungkin akan menyiapkan perbaikannya besok. :)

Yang perlu saya lakukan adalah memperbaiki infinite loop yang terjadi di metode ComputePi atau saya perlu mencegah semua konstanta dihitung di kelas Constant<T> . Meskipun saya mengakses Constant<T>.Zero , saat ini juga menghitung Constant<T>.Pi karena semua anggota kelas itu adalah bidang statis. Saya awalnya melakukan ini karena alasan kinerja.

Terima kasih telah mengirimkan masalah. Saya akan memposting tentang masalah ini lagi ketika sudah diperbaiki. :)

Saya telah memperbaiki masalah ini, meskipun saat ini saya membutuhkan lebih banyak operator daripada yang Anda miliki dalam sampel Anda. Semua metode pengujian untuk proyek Towel ada di dalam proyek Tools/Towel_Testing . Saya menambahkan metode pengujian untuk sampel Anda di sini:
https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Tools/Towel_Testing/Mathematics/Matrix.cs#L1737

Anda dapat melihat bahwa saya menambahkan operator berikut:

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);

Adapun metode ComputePi ... Saya lupa variabel ++ ... jadi terima kasih telah menangkapnya. Masih ada ruang untuk perbaikan, tetapi setidaknya itu memperbaiki masalah Anda. :) Ini baris yang saya lupa ++ di: https://github.com/ZacharyPatten/Towel/blob/a20b32e75b8c3fc903124a70d0fc543ecbe830bd/Sources/Towel/Constant.cs#L64

Saya belum memperbarui paket nuget pada posting ini, tetapi saya akan melakukannya dalam waktu dekat.

Apakah ada perbaikan terbaru sehingga saya bisa membuatnya bekerja sekarang? Mungkin saya harus menambahkan metode atau operator lain?

Saya yakin masalah ini telah diperbaiki di PR #54. Jika masih ada masalah atau masalah lebih lanjut, silakan buka kembali masalah ini atau buka edisi baru.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat