【问题标题】:Multiplying matrix polynomials in MATLAB在 MATLAB 中乘以矩阵多项式
【发布时间】:2013-08-16 21:23:49
【问题描述】:

我正在尝试执行类型的矩阵多项式乘法:

(A_1+A_2*y)*(B_1+B_2*y+B_3*y^2)

其中y 是变量,所有A_i 都是相同大小的常数矩阵,所有B_i 都是相同大小的常数矩阵,A_i*B_i 形式的矩阵乘法是有意义的。矩阵A_iB_i 是已知的并由用户指定。

正式地乘法应该导致C_1+C_2*y+C_3*y^2+C_4*y^3,我想知道C_i。在 MATLAB 中,如果 A_iB_i 是标量,则可以使用“conv”。但是,如果它们不是标量,问题就不那么容易了。我想知道是否有一种简单的方法(类似于“conv”)在 MATLAB 中使用矩阵执行此操作:给定 A_iB_i 我想知道 C_i?当然,我喜欢这个一般意义上的(任何次数的单变量矩阵多项式),并且非常希望避免使用符号工具箱。

【问题讨论】:

  • 我虽然明白你的问题,但其实不是很清楚。您想对矩阵 A_1、A_2 等做什么?你想让它们成为标量吗?来自矩阵的子引用?你试过什么?
  • @Werner 是的,一个例子会很有启发性。他想要的是等价于标量conv,例如:a = [1,1]; % <-> 1+1xb = [1,1]; % <-> 1+1xc = conv(a,b); % = [1,2,1] <-> (1+1x)*(1+1x) = 1+2x+1x^2。看看我的“Test by”代码的结尾,了解他在说什么:-)

标签: matlab matrix


【解决方案1】:

这可能不是最好的解决方案,但您可以为矩阵重新实现 conv,例如:

function C = convMat(A,B)
    nA = size(A,3);
    nB = size(B,3);
    n = nA + nB - 1;
    C = zeros([size(A,1),size(B,2),n]);
    for k = 1:n
        for j = max(1,k+1-nB):min(k,nA)
            C(:,:,k) = C(:,:,k) + A(:,:,j)*B(:,:,k-j+1);
        end
    end

为了您的兴趣:另一个(更糟糕的?)实现:

function C = convMat2(A,B)
    n = size(A,3) + size(B,3) - 1;
    C = zeros([size(A,1),size(B,2),n]);
    for mA = 1:size(A,1)
        for mB = 1:size(B,2)
            for l = 1:size(A,2) % = size(B,1)
                vA = A(mA,l,:);
                vA = vA(:);
                vB = B(l,mB,:);
                vB = vB(:);
                C(mA,mB,:) = C(mA,mB,:) + reshape(conv(vA,vB),[1,1,n]);
            end
        end
    end

测试者:

% matrix example
A(:,:,1) = rand(3,3); % A1
A(:,:,2) = rand(3,3); % A2
B(:,:,1) = rand(3,4); % B1
B(:,:,2) = rand(3,4); % B2
B(:,:,3) = rand(3,4); % B3

C1 = convMat(A,B);
C2 = convMat2(A,B);

% test
x = rand(1,1);
(A(:,:,1) + A(:,:,2)*x) * (B(:,:,1) + B(:,:,2)*x + B(:,:,3)*x^2)
C1(:,:,1) + C1(:,:,2)*x + C1(:,:,3)*x^2 + C1(:,:,4)*x^3
C2(:,:,1) + C2(:,:,2)*x + C2(:,:,3)*x^2 + C2(:,:,4)*x^3

我确信可以优化convMat

【讨论】:

    【解决方案2】:

    很简单,使用我的sympoly 工具箱,在文件交换中找到。 (这是否避免了符号 TB,而使用我自己的符号 TB 使答案无效?只有你可以决定。)我举个例子,矩阵是相当非创造性地构建的。

    sympoly y
    
    A_1 = rand(2);
    A_2 = rand(2);
    B_1 = rand(2);
    B_2 = rand(2);
    B_3 = rand(2);
    

    结果是符号多项式元素的 2x2 矩阵,因为加法、乘法和矩阵乘法都是为 sympoly 类定义的。

    (A_1+A_2*y)*(B_1+B_2*y+B_3*y^2)
    ans =
    Sympoly array has size = [2  2]
    
    Sympoly array element [1  1]
        0.88896 + 0.88074*y + 0.87653*y^2 + 0.33102*y^3
    Sympoly array element [2  1]
        0.87079 + 1.2145*y + 1.0628*y^2 + 0.69004*y^3
    Sympoly array element [1  2]
        0.64143 + 0.78816*y + 0.67242*y^2 + 0.2091*y^3
    Sympoly array element [2  2]
        0.64582 + 1.0162*y + 0.78167*y^2 + 0.4313*y^3
    

    【讨论】:

    • 谢谢。我也试过了,但发现@matheburg 的解决方案对我来说更实用。
    猜你喜欢
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多