You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python/MATLAB中计算块矩阵张量的n次幂?

分块矩阵n次幂的实现(Python/MATLAB)

问题说明

给定分块矩阵M,其中A、B、C、D均为2×2矩阵:

M = [[A, B],
     [C, D]]

需按照常规矩阵乘法规则计算其n次幂(例如n=2时结果为):

M^2 = [[A@A + B@C, A@B + B@D],
       [C@A + D@C, C@B + D@D]]

常规的matmul、matrix_power、pagemtimes无法直接处理这类分块结构,以下是手动实现方案:


Python 实现

方法:快速幂优化的分块矩阵乘法

通过自定义分块矩阵乘法函数,结合快速幂算法减少计算次数,避免低效的循环相乘:

import numpy as np

def block_matrix_mult(M1, M2):
    """定义分块矩阵乘法,输入M1、M2均为[[A,B],[C,D]]形式的分块矩阵"""
    A1, B1 = M1[0]
    C1, D1 = M1[1]
    A2, B2 = M2[0]
    C2, D2 = M2[1]
    
    # 计算每个子块
    new_A = A1 @ A2 + B1 @ C2
    new_B = A1 @ B2 + B1 @ D2
    new_C = C1 @ A2 + D1 @ C2
    new_D = C1 @ B2 + D1 @ D2
    
    return [[new_A, new_B], [new_C, new_D]]

def block_matrix_power(M, n):
    """计算分块矩阵M的n次幂,使用快速幂算法"""
    # 初始化结果为单位分块矩阵(对应子块都是2x2单位矩阵)
    result = [
        [np.eye(2), np.zeros((2,2))],
        [np.zeros((2,2)), np.eye(2)]
    ]
    
    current = M
    while n > 0:
        if n % 2 == 1:
            result = block_matrix_mult(result, current)
        current = block_matrix_mult(current, current)
        n = n // 2
    return result

# 示例使用
if __name__ == "__main__":
    # 生成随机2x2子矩阵
    A = np.random.rand(2,2)
    B = np.random.rand(2,2)
    C = np.random.rand(2,2)
    D = np.random.rand(2,2)
    M = [[A,B],[C,D]]
    
    n = 3
    M_power = block_matrix_power(M, n)
    # 输出结果的每个子块
    print("M^3的子块A:\n", M_power[0][0])
    print("M^3的子块B:\n", M_power[0][1])
    print("M^3的子块C:\n", M_power[1][0])
    print("M^3的子块D:\n", M_power[1][1])

MATLAB 实现

方法:分块矩阵乘法+快速幂

通过自定义分块乘法函数,结合快速幂提升计算效率:

function result = block_matrix_mult(M1, M2)
    % 定义分块矩阵乘法,输入M1、M2为{{A,B},{C,D}}形式的cell数组
    A1 = M1{1,1}; B1 = M1{1,2};
    C1 = M1{2,1}; D1 = M1{2,2};
    A2 = M2{1,1}; B2 = M2{1,2};
    C2 = M2{2,1}; D2 = M2{2,2};
    
    new_A = A1*A2 + B1*C2;
    new_B = A1*B2 + B1*D2;
    new_C = C1*A2 + D1*C2;
    new_D = C1*B2 + D1*D2;
    
    result = {{new_A, new_B}, {new_C, new_D}};
end

function result = block_matrix_power(M, n)
    % 计算分块矩阵M的n次幂
    % 初始化单位分块矩阵
    eye2 = eye(2);
    zeros2 = zeros(2);
    result = {{eye2, zeros2}, {zeros2, eye2}};
    
    current = M;
    while n > 0
        if mod(n,2) == 1
            result = block_matrix_mult(result, current);
        end
        current = block_matrix_mult(current, current);
        n = floor(n/2);
    end
end

% 示例使用
A = rand(2); B = rand(2);
C = rand(2); D = rand(2);
M = {{A,B},{C,D}};
n = 3;
M_power = block_matrix_power(M, n);

% 输出结果
disp('M^3的子块A:');
disp(M_power{1,1});
disp('M^3的子块B:');
disp(M_power{1,2});
disp('M^3的子块C:');
disp(M_power{2,1});
disp('M^3的子块D:');
disp(M_power{2,2});

内容的提问来源于stack exchange,提问作者Juan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:10:56