在这个问题中 ,我讨论了两个自定义函数,用于将3x3矩阵和3x1向量的数组相乘,保留3维(矩阵)内积的结构,并使整个过程尽可能高效地进行计算。
现在,我将这些函数推广为3x4矩阵和3x1向量的多维数组(NxN)。 这是我编写的使用for循环的函数。
标量
此函数应将(NxN矩阵)nv的ij元素(标量)乘以A(NxNx3x3矩阵)的ij元素(3x3矩阵)。 因此,它本质上是标量矩阵乘积的多维版本。
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];
输出:
标量(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*u的ijth元素(这是一个3x3矩阵)之间的A和包含的ijth元素的3个分量的列向量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个元素,每个元素是一个3x3单位矩阵),以及一个由3x1个向量组成的NxN矩阵,则:
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结构的对象(由3x1矢量组成的NxN矩阵),其中每个元素都是reshape(A(i,j,:,:),[3 3])和reshape(V(i,j,:),[1 3]) 。 那是:
i=1;j=1;
reshape(B(i,j,:),[3,1])
ans =
4
8
12
对于任何i和j 。
完整输出,以确保完整性:
B(:,:,1)=
4 4 4 4
B(:,:,2)=
8 8 8 8
B(:,:,3)=
12 12 12 12
问题
我努力(0)使BlockMatrix工作; (1)找到一种将其正确向量化的方法,以及(2)我什至还不确定向量化的版本会更快。
在回答以上几点的任何帮助将不胜感激。