Towel: 矩阵的自定义类?

创建于 2020-07-08  ·  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);

然后它挂了。 我想我遗漏了一些东西,但在文档或示例中找不到它,但我该如何使它工作?

最有用的评论

回复晚了非常抱歉。 我的代码中似乎存在问题。 它实际上不在矩阵代码中,它在我的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 :

在这篇文章中,我还没有更新 nuget 包,但我会在不久的将来更新。

是否有修补程序,以便我现在可以使其工作? 也许我应该添加另一种方法或运算符?

我相信这个问题已在 PR #54 中解决。 如果仍有问题或更多问题,请重新打开此问题或打开一个新问题。

此页面是否有帮助?
0 / 5 - 0 等级