Hi Hdk!



 Hdk:

I think you misunderstood what I want to achieve,


Yes, I do believe that I misunderstood your goal.
Am I right that you want each block of what I called the “auxiliary block
matrix” to be a copy of your matrix y?
If so, I think that a new feature (as of 1.8?), torch.kron() 1, might do what
you need.  Here’s an illustrative script:
import torch
torch.__version__

x = torch.randn (9, 9)
print (x)
y = torch.arange (9).reshape (3, 3).float()
print (y)
y_block = torch.kron (torch.ones (3, 3), y)
print (y_block)
block_prod = x * y_block
print (block_prod)

And here is its output:
>>> import torch
>>> torch.__version__
'1.8.0.dev20201203'
>>>
>>> x = torch.randn (9, 9)
>>> print (x)
tensor([[ 0.7726, -0.5733,  1.6097,  1.5556,  0.6953, -0.3901, -0.2402,  0.1618,
         -0.6779],
        [ 1.2874, -2.0785, -0.1511, -0.4685, -0.4369,  0.1307, -0.5300, -0.2147,
         -0.1542],
        [-0.4025,  0.4115,  0.2223, -0.5108, -1.6646,  1.8222,  0.7601,  0.7101,
         -0.2345],
        [ 0.3181,  1.2334,  0.4891, -2.5712,  0.5123, -1.5413, -0.1983, -0.2145,
          1.3856],
        [ 1.1100, -0.3581, -0.2157,  0.4873, -0.8274, -0.4914,  0.4379,  0.6812,
         -0.8991],
        [-1.1600,  0.7685,  0.5095,  0.3122,  1.4661, -0.6632,  0.2715, -0.4530,
          0.4327],
        [-0.8347, -2.8993, -2.7608, -0.7906,  0.3208, -1.0284,  0.9308, -1.3254,
         -1.6779],
        [-0.3797,  0.7627,  0.6850,  0.5627,  0.4745, -0.9528, -1.2549,  0.4859,
         -0.0178],
        [-1.8941,  0.0079,  2.0205,  0.1333, -0.3190,  1.7404, -0.1067,  0.5844,
         -0.0513]])
>>> y = torch.arange (9).reshape (3, 3).float()
>>> print (y)
tensor([[0., 1., 2.],
        [3., 4., 5.],
        [6., 7., 8.]])
>>> y_block = torch.kron (torch.ones (3, 3), y)
>>> print (y_block)
tensor([[0., 1., 2., 0., 1., 2., 0., 1., 2.],
        [3., 4., 5., 3., 4., 5., 3., 4., 5.],
        [6., 7., 8., 6., 7., 8., 6., 7., 8.],
        [0., 1., 2., 0., 1., 2., 0., 1., 2.],
        [3., 4., 5., 3., 4., 5., 3., 4., 5.],
        [6., 7., 8., 6., 7., 8., 6., 7., 8.],
        [0., 1., 2., 0., 1., 2., 0., 1., 2.],
        [3., 4., 5., 3., 4., 5., 3., 4., 5.],
        [6., 7., 8., 6., 7., 8., 6., 7., 8.]])
>>> block_prod = x * y_block
>>> print (block_prod)
tensor([[  0.0000,  -0.5733,   3.2195,   0.0000,   0.6953,  -0.7802,  -0.0000,
           0.1618,  -1.3557],
        [  3.8623,  -8.3139,  -0.7554,  -1.4055,  -1.7474,   0.6533,  -1.5901,
          -0.8588,  -0.7709],
        [ -2.4150,   2.8806,   1.7786,  -3.0647, -11.6520,  14.5776,   4.5606,
           4.9710,  -1.8756],
        [  0.0000,   1.2334,   0.9782,  -0.0000,   0.5123,  -3.0827,  -0.0000,
          -0.2145,   2.7712],
        [  3.3300,  -1.4326,  -1.0786,   1.4618,  -3.3095,  -2.4572,   1.3138,
           2.7249,  -4.4954],
        [ -6.9600,   5.3794,   4.0758,   1.8730,  10.2626,  -5.3054,   1.6288,
          -3.1710,   3.4613],
        [ -0.0000,  -2.8993,  -5.5215,  -0.0000,   0.3208,  -2.0569,   0.0000,
          -1.3254,  -3.3558],
        [ -1.1390,   3.0509,   3.4252,   1.6880,   1.8981,  -4.7641,  -3.7648,
           1.9438,  -0.0889],
        [-11.3648,   0.0554,  16.1641,   0.7995,  -2.2332,  13.9231,  -0.6401,
           4.0910,  -0.4107]])

Best.
K. Frank