记录一下自己学习lua语言的过程!
kronecker积的定义:
Hamadard积:
Khatri-Rao积:
输入格式是:先输入矩阵A的行数、列数,然后按从上到下、从左到右的顺序输入A中每一个数值,再输入矩阵B。还没有学习读写文件,不然用文件输入会更方便一些。
因为是初学,代码写的比较粗糙,有什么问题欢迎在评论区指正!
补充:之前的程序使用的是四层循环,效率非常低。学习了同学的代码之后做了改进,只使用两层循环。之后有空的话继续做一下改进,让输入变得更方便一些。现在只能逐个输入矩阵元素,不便于调试。
function PrintArray(arr, n, m) -- 输出一个n行m列的矩阵arr
for i = 1, n do
local s = ""
for j = 1, m do s = s .. tostring(arr[i][j]) .. " " end
print(s)
end
end
function InputArray(n, m) -- 输入一个n行m列的矩阵arr
local arr = {}
for i = 1, n do
arr[i] = {}
for j = 1, m do arr[i][j] = tonumber(io.read()) end
end
return arr
end
function Kronecker(n1, m1, n2, m2)
local arr = {}
for a = 1, n1 * n2 do
arr[a] = {}
local x1 = a % n2
if x1 == 0 then x1 = n2 end
for b = 1, m1 * m2 do
local x2 = b % m2
if x2 == 0 then x2 = m2 end
arr[a][b] = A[math.ceil(a / n2)][math.ceil(b / m2)] * B[x1][x2]
end
end
return arr
end
function Hadamard(n1, m1)
local arr = {}
for i = 1, n1 do
arr[i] = {}
for j = 1, m1 do arr[i][j] = A[i][j] * B[i][j] end
end
return arr
end
function KhatriRao(n1, m1, n2)
local arr = {}
for a = 1, n1 * n2 do
arr[a] = {}
local x = a % n2
if x == 0 then x = n2 end
for b = 1, m1 do arr[a][b] = A[math.ceil(a / n2)][b] * B[x][b] end
end
return arr
end
A = {}
B = {}
C = {}
-- 输入矩阵A的行、列数,再按行输入A
print("input matrix A:")
local n1 = tonumber(io.read())
local m1 = tonumber(io.read())
A = InputArray(n1, m1)
-- 输入矩阵B的行、列数,再按行输入B
print("input matrix B:")
local n2 = tonumber(io.read())
local m2 = tonumber(io.read())
B = InputArray(n2, m2)
C = Kronecker(n1, m1, n2, m2)
print("Kronecker result:")
PrintArray(C, n1 * n2, m1 * m2)
if n1 == n2 and m1 == m2 then
C = Hadamard(n1, m1)
print("Hadamard result:")
PrintArray(C, n1, m1)
end
if m1 == m2 then
C = KhatriRao(n1, m1, n2)
print("Khatri-Rao result:")
PrintArray(C, n1 * n2, m1)
end