lua语言 计算矩阵的kronecker积

记录一下自己学习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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值