Thread overview
Matrislerde Dört İşlem
Aug 08, 2021
Salih Dincer
Aug 09, 2021
Ferhat Kurtulmuş
Aug 09, 2021
Salih Dincer
Aug 10, 2021
Ferhat Kurtulmuş
August 08, 2021

Merhaba,

Bilmiyorum, tıpkı std.complex gibi matrislerde işlem yapabilmek için bir modül var mı?

Konumuz dışı ama kompleks sayılar örneğin şöyle:

import std.complex;

auto a = complex(1.0, 2.0);
auto b = pow(a, 2);
auto aÇARPIb = a * b;
// Çünkü eşittir a'nın kübüne:
assert(aÇARPIb == pow(a, 3));

Ama Ali Çehreli'nin kitabındaki, Ayrıntılı Şablonlar bölümünün sonundaki Matris örneği harikulade: http://www.ddili.org/ders/d/sablonlar_ayrintili.html

Biraz ekleme yaptım ve bir örnek (soru1) çözdüm de çalışıyor! Tabi matrislerde çarpma için biraz daha emek gerek :)

import std.stdio;
import std.format;
import std.string;

struct Matris(T) {
  alias m = satırlar;

  T[][] satırlar;

  /* İndekslerle belirlenen satır ve sütun aralığı
   * bilgisini bir araya getirir.
   */
  struct Aralık { size_t baş, son; }
  /* Satır ve sütun aralıklarıyla belirlenen
   * alt matrisi döndürür.
   */
  auto altMatris(Aralık satırAralığı, Aralık sütunAralığı) {
    T[][] dilimler;

    foreach (d; m[satırAralığı.baş .. satırAralığı.son]) {

    dilimler ~= d[sütunAralığı.baş .. sütunAralığı.son];
    }
    return Matris(dilimler);
  }

  this(size_t yükseklik, size_t genişlik) {
/* S.Dinçer gizledi
 *   writeln(__FUNCTION__);
 */
    this.m = new T[][](yükseklik, genişlik);
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (Matris yeniMatris) if(op == "+") {
    foreach (x, satır; yeniMatris.m) {
      foreach (y, sütun; satır) {
        this.m[x][y] += sütun;
        // writefln("%d, %d: %d", x, y, sütun);
      }
    }
    return this;
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (Matris yeniMatris) if(op == "-") {
    foreach (x, satır; yeniMatris.m) {
      foreach (y, sütun; satır) {
        this.m[x][y] -= sütun;
        // writefln("%d, %d: %d", x, y, sütun);
      }
    }
    return this;
  }
  /* Farklı boyutlardaki, örneğin 2x3 ile 3x2
   * matrisleri matematikte satır/sütun ilişkisi
   * çerçevesinde işlem yapılır ve sonuç 2x2'dir.
   * Şimdilik ertelendi...
  auto opOpAssign(string op) (Matris yeniMatris) if(op == "*") {
    return this;
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (T n) if(op=="+") {
    foreach(x; m) x[] += n;
    return this;
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (T n) if(op=="-") {
    foreach(x; m) x[] -= n;
    return this;
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (T n) if(op=="*") {
    foreach(x; m) x[] *= n;
    return this;
  }

  /* S.Dinçer ekledi */

  auto opOpAssign(string op) (T n) if(op=="/") {
    foreach(x; m) x[] /= n;
    return this;
  }

  /* S.Dinçer ekledi */

  this(T[][] satırlar) {
    this.m = satırlar;
  }

  void toString(void delegate(const(char)[]) hedef) const {
    hedef.formattedWrite!"%(%(%5s %)\n%)"(m);
    hedef.formattedWrite!"\n";
  }

  auto opAssign(T değer) {
    foreach (satır; m) satır[] = değer;
    return this;
  }

  size_t opDollar(size_t boyut)() const
    if (boyut <= 1) {
      static if (boyut == 0) {
        return m.length;
      } else {
        return m.length ? m[0].length : 0;
      }
    }

  auto opSlice(size_t boyut) (size_t baş, size_t son) if (boyut <= 1) {
    return Aralık(baş, son);
  }

  auto opIndex(A...) (A param)if (A.length <= 2) {
    Aralık[2] aralık = [ Aralık(0, opDollar!0),
                         Aralık(0, opDollar!1) ];
    foreach (boyut, p; param) {
      static if (is (typeof(p) == Aralık)) {
        aralık[boyut] = p;
      } else static if (is (typeof(p) : size_t)) {
        aralık[boyut] = Aralık(p, p + 1);
      } else {
        static assert(
          false, format("Geçersiz indeks türü: %s",
          typeof(p).stringof)
        );
      }
/* S.Dinçer gizledi
 * boyut.writeln("< boyut / aralıkla, >", aralık);
 */
    }
    return altMatris(aralık[0], aralık[1]);
  }

  auto opIndexAssign(A...)(T değer, A param) if (A.length <= 2) {
    Matris altMatris = opIndex(param);

    return altMatris = değer;
  }
}

struct ikiliDenklem (T) {
  Matris!T x, y;
  string d1, d2;

  this(size_t yükseklik, size_t genişlik) {
    x = Matris!T(3, 3);
    y = Matris!T(3, 3);
  }

  void terim1(string terim, T[][] matris) {
    x += Matris!T(matris);
    d1 = terim;
  }
  void terim2(string terim, T[][] matris) {
    y += Matris!T(matris);
    d2 = terim;
  }
  void toString(void delegate(const(char)[]) hedef) const {
    hedef.formattedWrite!"%s =\n%(%(%5s %)\n%)"(d1, x.m);
    hedef.formattedWrite!"\n";
    hedef.formattedWrite!"%s =\n%(%(%5s %)\n%)"(d2, y.m);
    hedef.formattedWrite!"\n";
  }
}

void main() {
  int[][] AartıB =        [[3, 4, 9],
                           [7, 3, 7],
                           [4, 9, 6]];

  int[][] ikiAeksidörtB = [[0, 2, 6],
                           [8, 6, 8],
                           [8, 6, 6]];

  /* A + B = [...] ve 2A - 4B = [...]
   * ise B matrisini bulunuz:
   */
  auto soru1 = ikiliDenklem!int(3, 3);
       soru1.terim1 ("A + B", AartıB.dup);
       soru1.terim2 ("2A - 4B", ikiAeksidörtB.dup);
       //++soru1.x;
       soru1.writeln; // Denklemleri yazar...
  with(soru1) {
    "ÇÖZÜM:".writeln;
    x *= 2;  // Matrisi 2 ile genişletiyoruz,
    y *= -1; // Tüm matris eksili oluyor...
    y += x;  // Toplamları y matrisinde
    x /= 2;  // x eski halinde: A+B matrisi
    y.writeln("__________________");
    writeln("[2(A+B) -1(2A-4B)]/6\nB =");

    y /= 6; // Çözüm kümesi 6B olduğundan,
    y.writeln; // B'nin sonucu: M/6
    "A =".writeln;
    x -= y;
    x.writeln;
  }
}/* ÇIKTISI:
A + B =
    3     4     9
    7     3     7
    4     9     6
2A - 4B =
    0     2     6
    8     6     8
    8     6     6

ÇÖZÜM:
    6     6    12
    6     0     6
    0    12     6
__________________
[2(A+B) -1(2A-4B)]/6
B =
    1     1     2
    1     0     1
    0     2     1

A =
    2     3     7
    6     3     6
    4     7     5
*/

Başarılar...

August 09, 2021

On Sunday, 8 August 2021 at 22:03:03 UTC, Salih Dincer wrote:

>

Merhaba,

Bilmiyorum, tıpkı std.complex gibi matrislerde işlem yapabilmek için bir modül var mı?

[...]

D ile uğraşmaya başladığım zamanlarda elips fitlemek için matrislerle biraz da öğrenmek için uğraşmıştım. Burada[1] ama biraz modası geçmiş bir kod tabanı (opMul artık demode olmalı). Eğer amaç birşeyler öğrenmek değilse sanırım bu tarz işler için optimize mir[2] kütüphanelerini kullanmak en iyisi.

1: https://github.com/aferust/regionpropsford/blob/master/source/measure/types.d
2: https://github.com/9il

Ferhat

August 09, 2021

On Monday, 9 August 2021 at 13:37:29 UTC, Ferhat Kurtulmuş wrote:

>

On Sunday, 8 August 2021 at 22:03:03 UTC, Salih Dincer wrote:
Eğer amaç birşeyler öğrenmek değilse sanırım bu tarz işler için...

Tam olarak bir şeyler öğrenmek, hem de 2 kuş vurarak: Matematik ve Programlama

Çünkü bize ya doğru düzgün matematik anlatmadılar ya da biz o zaman anlamadık! Ama şimdi anlıyorum ki bir matris, bir düzlem, bir türev ve oradan limite... Yetmez kompleks sayılar ve trigonometri. Tabii ki çoğu ile ilişkili lineer cebir. Off neler var Allahım! Logoritmayı da unuttuk :)

void main() {
   double[][] birimMatris = [[1.0, 0.0, 0.0],
                             [0.0, 1.0, 0.0],
                             [0.0, 0.0, 1.0]];
   auto m1 = Matris!double(birimMatris);
   auto boşMatris = Matris!double(3, 3);

   boşMatris = m1;
   boşMatris++;
   //boşMatris += m1;
   "boşMatris Matrisi".writeln(":\n", boşMatris);
   m1 += 1; // Matematiksel toplamada hata!
   m1 *= 3;
   m1 *= -1;

   //birimMatris +=1;
   "birimMatris Dizisi".writeln(":\n", birimMatris);
   "m1 Matrisi".writeln(":\n", m1);
}

Meğer matematiksel matrisi, bir tam sayı ile toplarken birim matrisin orada olduğunu varsaymamız lazımmış. Bunu yukarda denedim. Tıpkı x²-2x+3'de 3'ün yanında bir x⁰ yani 1 olduğunu aynı şekilde ortadaki x'in aslında kuvvettin 1 olduğu ama kendisini verdiğini unutmamımız gibi.

August 10, 2021

On Monday, 9 August 2021 at 21:25:47 UTC, Salih Dincer wrote:

>

On Monday, 9 August 2021 at 13:37:29 UTC, Ferhat Kurtulmuş wrote:

>

Tam olarak bir şeyler öğrenmek, hem de 2 kuş vurarak: Matematik ve Programlama

Çünkü bize ya doğru düzgün matematik anlatmadılar ya da biz o zaman anlamadık!

Evet. Ben de makale, kitap yada ilgili wikipedia sayfalarına başvurmadan bu tarz kodları yazamam. Uğraşmaya başlayınca öğreniyorum ama aradan zaman geçip de gündelik kullanmamışsam unutuyorum. Bence doğal bir durum bu. Ama bazı temel şeyleri hatırlıyorsun. Mesela bir birine dik iki vektörün çarpımının -1 olması gibi. PCA'da falan kullanıyorduk.