我正在尝试执行以下类型的矩阵多项式乘法:
(A_1+A_2*y)*(B_1+B_2*y+B_3*y^2)
其中y
是变量,所有A_i
都是相同大小的常量矩阵,所有B_i
都是相同大小的常量矩阵,并且表格的矩阵乘法A_i*B_i
是有道理的。矩阵A_i
和B_i
是已知的,并由用户指定。
正式的乘法应该导致C_1+C_2*y+C_3*y^2+C_4*y^3
,我想知道C_i
。在MATLAB中,如果A_i
和B_i
是标量,则可以使用'conv'。但是,如果它们不是标量,问题就不那么容易了。我想知道在MATLAB中用矩阵做一个简单的方法(类似于'conv'):给定A_i
和B_i
我想知道C_i
?当然,我在一般意义上喜欢这个(任何程度的单变量矩阵多项式),并且非常希望避免使用符号工具箱。
答案 0 :(得分: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
。
答案 1 :(得分:0)
使用我在文件交换中找到的sympoly工具箱很简单。 (事实上,这可以避免象征性结核病,而使用我自己的同情结核病会使答案无效吗?只有你可以决定。)我将举例说明,矩阵是非创造性的。
sympoly y
A_1 = rand(2);
A_2 = rand(2);
B_1 = rand(2);
B_2 = rand(2);
B_3 = rand(2);
结果是符号多项式元素的2x2矩阵,因为加法,乘法和矩阵乘法都是为同义类定义的。
(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