Towel: 행렬에 λŒ€ν•œ μ‚¬μš©μž μ •μ˜ 클래슀?

에 λ§Œλ“  2020λ…„ 07μ›” 08일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: ZacharyPatten/Towel

λ‚˜λŠ” 당신이 행렬에 λŒ€ν•΄ μ‚¬μš©μž μ •μ˜ 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 그것을 톡과할 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ‚΄ floatλ₯Ό κ΅¬ν˜„ν•˜κ³  μ‹Άλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€.

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

κ·Έλ¦¬κ³ λŠ” 멈μΆ₯λ‹ˆλ‹€. λ­”κ°€ 빠진 것 같은데 λ¬Έμ„œλ‚˜ μƒ˜ν”Œμ—μ„œ 찾을 수 μ—†λŠ”λ° μ–΄λ–»κ²Œ μž‘λ™ν•˜κ²Œ ν•©λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹΅μž₯을 늦게 λ³΄λ‚΄μ„œ λ―Έμ•ˆν•΄. λ‚΄ μ½”λ“œμ— λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” Matrix μ½”λ“œκ°€ μ•„λ‹ˆλΌ Constant<T> ν΄λž˜μŠ€μ— μ•‘μ„ΈμŠ€ν•  λ•Œ ν˜„μž¬ μ‹€ν–‰λ˜λŠ” ComputePi λ©”μ„œλ“œμ— μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ‰¬μš΄ μˆ˜μ •μ΄ 될 것이며 내일쯀 μˆ˜μ •μ„ μ€€λΉ„ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. :)

λ‚΄κ°€ ν•΄μ•Ό ν•  일은 ComputePi λ©”μ„œλ“œμ—μ„œ λ°œμƒν•˜λŠ” λ¬΄ν•œ 루프λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ λͺ¨λ“  μƒμˆ˜κ°€ Constant<T> ν΄λž˜μŠ€μ—μ„œ κ³„μ‚°λ˜λŠ” 것을 방지해야 ν•©λ‹ˆλ‹€. Constant<T>.Zero μ•‘μ„ΈμŠ€ν•˜κ³  μžˆμ§€λ§Œ ν•΄λ‹Ή 클래슀의 λͺ¨λ“  ꡬ성원이 정적 ν•„λ“œμ΄λ―€λ‘œ ν˜„μž¬ Constant<T>.Pi 도 κ³„μ‚°ν•©λ‹ˆλ‹€. μ›λž˜λŠ” μ„±λŠ₯μƒμ˜ 이유둜 이 μž‘μ—…μ„ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

문제λ₯Ό μ œμΆœν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 이 λ¬Έμ œκ°€ ν•΄κ²°λ˜λ©΄ λ‹€μ‹œ κ²Œμ‹œν•˜κ² μŠ΅λ‹ˆλ‹€. :)

λͺ¨λ“  4 λŒ“κΈ€

λ‹΅μž₯을 늦게 λ³΄λ‚΄μ„œ λ―Έμ•ˆν•΄. λ‚΄ μ½”λ“œμ— λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œλŠ” Matrix μ½”λ“œκ°€ μ•„λ‹ˆλΌ Constant<T> ν΄λž˜μŠ€μ— μ•‘μ„ΈμŠ€ν•  λ•Œ ν˜„μž¬ μ‹€ν–‰λ˜λŠ” ComputePi λ©”μ„œλ“œμ— μžˆμŠ΅λ‹ˆλ‹€. 이것은 μ‰¬μš΄ μˆ˜μ •μ΄ 될 것이며 내일쯀 μˆ˜μ •μ„ μ€€λΉ„ν•  수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. :)

λ‚΄κ°€ ν•΄μ•Ό ν•  일은 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 λ“±κΈ‰