In this question,我讨论了两个自定义函数,用于将3×3矩阵和3×1向量的数组相乘,保留了三维(矩阵)内积的结构,并使整个过程尽可能高效,快速.
我现在将这些函数推广到3×4矩阵和3×1向量的多维数组(NxN).以下是我编写的函数,它们使用for循环.
BlockScalar
该函数应该将(N×N矩阵)nv的ij元素(标量)乘以A(NxNx3x3矩阵)的ij元素(3×3矩阵).所以它基本上是一个标量乘积的多维版本.
function [B] = BlockScalar(nv,A)
N=size(nv,1);
B=zeros(N,N,3,3);
for i=1:N
for j=1:N
B(i,j,:,:)= nv(i,j).*A(i,j,:,:);
end
end
end
——– BlockScalar示例
输入:
N=2;
A = shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );
nv=[1 2; 3 4];
输出:
BlockScalar(nv,A)
ans(:,:,1,1)=1 2 3 4
ans(:,:,2,1)=0 0 0 0
ans(:,:,3,1)=0 0 0 0
ans(:,:,1,2)=0 0 0 0
ans(:,:,2,2)=1 2 3 4
ans(:,:,3,2)=0 0 0 0
ans(:,:,1,3)=0 0 0 0
ans(:,:,2,3)=0 0 0 0
ans(:,:,3,3)=1 2 3 4
分块矩阵
第二个函数目前不起作用,因为我正在努力在A的第i个元素(它是一个3×3矩阵)和包含第i个元素的3个元素的列向量之间实现矩阵乘积A * u. ü.正如您可能很容易看到的,我希望这是3-D中矩阵*向量乘积的多维推广.
function [B] = BlockMatrix(A,u) N = size(u,2); B = zeros(N,N,3); for i=1:N for j=1:N B(i,j,:)= reshape(reshape(A(i,j,:,:),[3,3])*reshape(u(i,j,:),[1 3]),size(u)); end end
——- BlockMatrix示例
如果输入是广义单位矩阵(每个NxN元素是3×3单位矩阵),则NxN矩阵由3×1向量组成:
N=2; A = 4.*shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 ); c = ones(2,2); V(1,1,:)=[1 2 3]; u = c.*V;
期望的输出显然是具有V(NxN矩阵由3×1向量构成)的结构的对象,其中每个元素是重塑的矩阵乘积(A(i,j,:,:),[3 3])和重塑(V(i,j,:),[1 3]).那是:
i=1;j=1; reshape(B(i,j,:),[3,1]) ans = 4 8 12
对于任何我和j.
完整输出,完整性:
B(:,:,1) =
060014
B(:,:,2) =
060015
B(:,:,3) =
060016
问题
我很难(0)让BlockMatrix工作; (1)找到一种正确的矢量化方法,(2)我甚至不确定矢量化版本会更快.
任何帮助回答上述问题都将非常感激.
最佳答案 对于第一个功能:
B = bsxfun(@times, A, nv);
对于第二个:
B = sum(bsxfun(@times, A, reshape(u, [size(u,1) size(u,2) 1 size(u,3)])), 4);