matlab 三维矩阵向量化,matlab - 3-D对象的多维数组:如何向量化内积 - 堆栈内存溢出...

在这个问题中 ,我讨论了两个自定义函数,用于将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)我什至还不确定向量化的版本会更快。

在回答以上几点的任何帮助将不胜感激。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值