Matris-Vector'u hesaplayın


14

En az iki elemandan oluşan bir tamsayı dizisi verildiğinde, dizinin Matrix-Vector (aşağıda tanımlanan) çıktısını alın .

Matris- Vector'u hesaplamak için önce boyut ngiriş dizisi boyunca döndürerek , boyutun bir matrisini oluşturun n x nve dizinin ilk öğesi ana diyagonalden sonra gelir. Bu matris bölümünü oluşturur. Vektör için giriş dizisini dikey olarak çevirin. Sonra normal matris çarpımı gerçekleştirin. Sonuç vektörü sonuçtur.

Örneğin,

a = [1, 2, 3]

İlk olarak, elde etmek için diziyi iki kez sağa döndürün [3, 1, 2]ve [2, 3, 1]ardından bir 3x3matris oluşturmak için yığınlayın

[[1, 2, 3]
 [3, 1, 2]
 [2, 3, 1]]

Ardından, vektörü oluşturmak için diziyi dikey olarak çevirin

[[1, 2, 3]    [[1]
 [3, 1, 2]  x  [2]
 [2, 3, 1]]    [3]]

Normal matris çarpımı gerçekleştirme

[[1, 2, 3]    [[1]    [[1+4+9]    [[14]
 [3, 1, 2]  x  [2]  =  [3+2+6]  =  [11]
 [2, 3, 1]]    [3]]    [2+6+3]]    [11]]

Ve çıktı [14, 11, 11]ya da [[14], [11], [11]](düzleştirilmiş olsun ya da olmasın seçiminiz).

Örnek 2

a = [2, 5, 8, 3]

[[2, 5, 8, 3]    [[2]    [[4+25+64+9]     [[102]
 [3, 2, 5, 8]  x  [5]  =  [6+10+40+24]  =  [80]
 [8, 3, 2, 5]     [8]     [16+15+16+15]    [62]
 [5, 8, 3, 2]]    [3]]    [10+40+24+6]]    [80]]

[102, 80, 62, 80]

kurallar

  • Giriş ve çıktının, dilinizin yerel tamsayı türüne uygun olduğu varsayılabilir.
  • Giriş ve çıkış herhangi bir uygun formatta verilebilir .
  • Tam bir program veya bir işlev kabul edilebilir. Bir işlev varsa, çıktıyı yazdırmak yerine döndürebilirsiniz.
  • Mümkünse, diğer kişilerin kodunuzu deneyebilmesi için lütfen bir çevrimiçi test ortamına bağlantı ekleyin!
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Yanıtlar:


8

Jöle , 5 bayt

ṙJṚæ.

Çevrimiçi deneyin!

açıklama

İlk olarak:

burada olan satır vektörleri ve a, kolon vektörü.vkx

Bu, matris çarpımının satırlar ve sütunlar arasında sadece nokta ürün olduğunu gösterir.

Sonra, aslında olduğu döndürülmüş sağa ve edilir döndürülmüş sağ vs.v1v0vkvk-1

Başka bir açıdan, bir döndürülmüş sola ve edilir döndürülmüş sola, vbv1vnvnv1

Nasıl çalışır

ṙJṚæ.   input: z (a list of length n)
ṙJ      [rot(z,1), rot(z,2), ..., rot(z,n)] (to the left)
  Ṛ     [rot(z,n), ..., rot(z,2), rot(z,1)]
   æ.   [rot(z,n).z , ..., rot(z,2).z , rot(z,1).z] (dot product)




3

Jöle , 9 bayt

LḶN⁸ṙæ×W€

Çevrimiçi deneyin!

Dikey dizi döndüren bir işlev. Tam bir program olarak, yatay bir dizi döndürüyormuş gibi görünür. Bunun LḶN⁸ṙ×⁸S€yerine yatay bir dizi döndürmek için yapardınız .



2

Haskell , 49 bayt

f v=sum.zipWith(*)v.fst<$>zip(iterate tail$v++v)v

Çevrimiçi deneyin!

Bir giriş için v=[1,2]

  • iterate tail$v++v listeyi verir [[1,2,1,2],[2,1,2],[1,2],[2],[],...]
  • fst<$>zip l vtake(length v)lve verim ile aynıdır[[1,2,1,2],[2,1,2]]
  • sum.zipWith(*)v her bir eleman üzerinde haritalanır ve vektör matris sıralı ürünü verir.

Cevabımdan çok daha akıllı! Çok hoşuma gitti fst<$>zip l v.
jferard

2

R , 66 62 bayt

sapply(length(n<-scan()):1,function(i)c(n[-(1:i)],n[1:i])%*%n)

Çevrimiçi deneyin!


kullanılarak Map(function(i)c(n[-(1:i)],n[1:i])%*%n,length(n<-scan()):1)3 daha kısa bayt olup; sadece matrislerin bir listesini döndürür.
Giuseppe

for for döngüsü for(i in seq(n<-scan()))F=c(c(n[-(1:i)],n[1:i])%*%n,F);F[1:i], garip bir çıktı biçimi döndürmeden 61 bayttır.
Giuseppe





1

J , 14 bayt

+/ .*~#\.1&|.]

Çevrimiçi deneyin!

açıklama

+/ .*~#\.1&|.]  Input: array M
      #\.       Length of each suffix, forms the range [len(M), ..., 2, 1]
             ]  Identity, get M
         1&|.   For each 'x' in the suffix lengths, rotate left M  by 'x'
+/ .*~          Dot product with M

Bu çok hoş. Bir soru. Ne zaman do 1&|.sen bağ değildir 1için |.bir monad yaratarak? ancak daha sonra bu monad'ı hem sol hem de sağ argümanla kullanırsınız, sol taraf kaç kez uygulandığını belirler. Burada neler oluyor?
Jonah

@Jonah Bunun için özel bir form &. Olarak kullanıldığında u n&f v, performans gösterir (n&f)^:u v. Daha fazla ayrıştırma görmek için bağın altına bakın.
mil

ah, TIL. bu sık kullandığınız bir şey mi?
Jonah

@Jonah Birçok durumda golf oynamak için kullanışlıdır. Bu durumda, sıralama kullanarak eşit sayıda baytta yapılabilirdi #\.|."{], ancak alternatifleri denemeden önce ilk bulduğum en kısa şeyi gönderdim.
mil

1

APL, 17 bayt

(↑¯1⌽(⍳≢)⌽¨⊂)+.×⍪

Açıklama:

(↑¯1⌽(⍳≢)⌽¨⊂)+.×⍪

 ↑                      matrix format of
  ¯1⌽                   right rotate by 1 of
     (⍳≢)               the 1..[length N]
         ⌽¨             rotations of
           ⊂            the enclosed input
             +.×        inner product with
                ⍪       1-column matrix of input


1

Haskell , 56 55 52 bayt

f l=[sum$zipWith(*)l$drop i$l++l|i<-[0..length l-1]]

Çevrimiçi deneyin!

@Laikoni sayesinde bir bayt kaydedildi

Üç bayt kaydedildi: l++lyerinecycle l


İle bir bayt kaydedebilirsiniz zipWith(*)l$drop i$cycle l.
Laikoni

1

Kabuk , 11 bayt

mΣ§‡*´ṀKoṫ¢

Çevrimiçi deneyin!

açıklama

mΣ§‡*´ṀKoṫ¢  Implicit input, e.g. [1,2,3]
          ¢  Cycle: [1,2,3,1,2,3,...
        oṫ   Tails: [[1,2,3,1,2,3...],[2,3,1,2,3...],[3,1,2,3...]...
     ´ṀK     Replace each element of input with input: [[1,2,3],[1,2,3],[1,2,3]]
   ‡*        Vectorized multiplication (truncated with respect to shortest list)
  §          applied to the last two results: [[1,4,9],[2,6,3],[3,2,6]]
mΣ           Sum of each row: [14,11,11]

1

Oktav - 67 48 bayt

Bu kodu 19 bayt kadar düşürdüğü için Luis Mendo'ya teşekkürler!

Not: Bu kod yalnızca Octave'de çalıştırılabilir. MATLAB, değişkenler yaratabilen işlevler içindeki ifadeleri desteklerken, bunları oluşturan ifadeleri aynı anda değerlendirir.

n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'

MATLAB'daki orijinal kod burada bulunabilir, ancak MATLAB'ın herhangi bir sürümünde çalıştırılabilir. Bu kod 67 bayttır:

a=input('');n=numel(a)-1;a(mod(bsxfun(@minus,0:n,(0:n)'),n+1)+1)*a'

açıklama

  1. a=input('');- Standart giriş üzerinden kullanıcıdan bir (satır) vektörü alır. Vektörü Octave (yani [1,2,3]) şeklinde girmelisiniz .
  2. n=numel(...); - Giriş vektöründeki toplam eleman sayısını elde eder.
  3. x=0:n-1- 1'den adımlara 0kadar artan bir satır vektörü oluşturur n-1.
  4. (x=0:n-1)-x'- Bir n x nmatrisin olması için yayını gerçekleştirir, böylece her satır i0'dan n-1satırdaki her öğenin içıkarıldığı öğeler olur i.
  5. mod(..., n)+1- Negatif olan değerlerin, nher satırın i0'dan vektöre kadar n-1 dairesel olarak sola kaydırılarak iöğeleri içermesini sağlar. MATLAB / Octave vektörleri veya matrisleri 1 ile endekslemeye başladığında 1 ekliyoruz.
  6. a(...)- n x n(4) ' ü kullanarak, (4)' ten her bir değer tarafından dikte edilen giriş vektörünün doğru indekslerine erişerek ihtiyacımız olan matrisi elde ettiğimiz bir matris oluşturur.
  7. (...)*a'- Çarpma işleminden aönce sütun vektörü haline getirme / çevirme ile matris vektörü çarpımını gerçekleştirir .

Örnek İşlemler

>> n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'
[1,2,3]

ans =

         14.00
         11.00
         11.00

>> n=numel(a=input(''));a(mod((x=0:n-1)-x',n)+1)*a'
[2,5,8,3]

ans =

        102.00
         80.00
         62.00
         80.00

Çevrimiçi deneyin!


Bunun yerine örtük genişletme kullanabilirsiniz bsxfun. nOlmadan tanımlamak da -1birkaç bayt kazandırır. Ve eğer Octave ile kısıtlıyorsanız, değişkenleri anında atayabilir ave biraz daha kaydedebilirsiniz . Ayrıca, daha sık buraya gel !! :-D0:n
Luis Mendo

@LuisMendo ah evet. Octave'ın zaten genişletilmiş örtülü genişletme olduğunu unutuyorum. Ayrıca, değişkenin inputfonksiyonun içine kaydedilmesi büyük bir numaradır. Bunu destekleyebileceğini düşünmemiştim. Kendi deneyimimden sadece C veya C ++ 'da gördüm. Teşekkürler!
rayryeng - Monica'yı yeniden canlandırın

1
@ LuisMendo Önerilen değişikliklerinizi yakında bir düzenleme olarak yerleştireceğim. Meşgulüm, ancak bu giriş kesinlikle bayt sayısında asla kazanamayacağı için bunu bir öncelik haline getirmedim.
rayryeng - Monica

@LuisMendo Değişti. Çok teşekkür ederim :) Yukarıdaki açıklamamı değiştirirken kodu anlamalıyım.
rayryeng - Monica

Sevindim yardımcı olabilir :-)
Luis Mendo

0

Javascript 79 bayt

Bir girdi dizisini alır ve bir matris vektörü dizisi çıkarır

a=>(b=[...a],a.map(x=>([...b].reduce((m,n,i)=>m+=n*a[i],0,b.push(b.shift())))))

açıklama

a=>(
    b=[...a],                    // copy the input into b
    a.map(x=>(                   // transform a into a new array
        [...b].reduce(           // copy b into a new array and reduce
            (m,n,i)=>m+=n*a[i],  // memo += the element in the array * the ith
                                 // element in a
            0,                   // start memo at 0
            b.push(b.shift())    // shift the first element in b to the end
                                 // not used by reduce, but performing this op
                                 // here saves a few bytes
        )
    ))
)

0

Clojure, 80 bayt

#(map(fn[_ c](apply +(map * c %)))%(iterate(fn[c](into[(last c)](butlast c)))%))

iteratesonsuz bir dizi üretir, ancak (take (count %) (iterate ...))durdurmak için kullanmak yerine, %ekstra bir argüman olarak kullanırım map.


0

Perl 5 , 65 + 1 (-a) = 66 bayt

@o=@F;for(@o){$r=0;$r+=$_*$F[$i++%@F]for@o;say$r;unshift@F,pop@F}

Çevrimiçi deneyin!

Girdi vektörünü boşlukla ayrılmış sayılar olarak alır. Sonuç vektörünü temsil eden satır besleme ayrı sayılar verir.



0

Ortak Lisp, 78 bayt

(lambda(x)(loop as i on(append x x)as y in x collect(reduce'+(mapcar'* i x))))

Çevrimiçi deneyin!

Diziyi ikiye katlayın (bu durumda bir Lisp listesi) ve alt listeleri i( yinelemeyi durdurmak için x, ile y, kullanarak ) tekrarlayın. Daha sonra her bir elemanı çarpılması sonucu toplanmasıyla sonucunun bir sonraki elemanın hesaplamak xher bir elemanı ile i(yine daha kısa bir liste sonlandırıldığında durdurulması).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.