我有两个三维数组,前两个维度表示矩阵,最后一个维度通过参数空间计算,作为一个简单的例子拿
A = repmat([1,2; 3,4], [1 1 4]);
Run Code Online (Sandbox Code Playgroud)
(但假设A(:,:,j)每个人都不同j).一个如何能够容易地进行以每个j两个这样的矩阵阵列的矩阵乘法A和B?
C = A; % pre-allocate, nan(size(A,1), size(B,2)) would be better but slower
for jj = 1:size(A, 3)
C(:,:,jj) = A(:,:,jj) * B(:,:,jj);
end
Run Code Online (Sandbox Code Playgroud)
当然可以胜任,但是如果第三维更像是1e3元素,那么这非常慢,因为它不使用MATLAB的矢量化.那么,有更快的方法吗?
一如既往地想从你身上学到更多东西,我希望能通过以下代码获得一些帮助.
我需要完成以下任务:
1)我有一个向量:
x = [1 2 3 4 5 6 7 8 9 10 11 12]
Run Code Online (Sandbox Code Playgroud)
2)和矩阵:
A =[11 14 1
5 8 18
10 8 19
13 20 16]
Run Code Online (Sandbox Code Playgroud)
我需要能够将each值x与every值相乘A,这意味着:
new_matrix = [1* A
2* A
3* A
...
12* A]
Run Code Online (Sandbox Code Playgroud)
这将给我这个new_matrix大小(12*m x n)假设A (mxn).在这种情况下(12*4x3)
我怎么能用bsxfunmatlab 做这个呢?并且,这种方法会比一个快for-loop吗?
关于我for-loop,我在这里也需要一些帮助...我无法存储每个"new_matrix"循环运行:(
for i=x
new_matrix = A.*x(i)
end
Run Code Online (Sandbox Code Playgroud)
提前致谢!! …
可能重复:
MATLAB:如何向量乘两个矩阵数组?
有没有办法在Matlab中签订高维张量?
例如,假设我有两个三维数组,具有以下大小:
size(A) == [M,N,P]
size(B) == [N,Q,P]
Run Code Online (Sandbox Code Playgroud)
我想承包A和B分别在第二和第一指标.换句话说,我想考虑A成为一个大小矩阵的数组,[M,N]并且B是等长的[N,Q]矩阵数组; 我想逐个元素(逐个矩阵)乘以这些数组来获得大小[M,Q,P].
我可以通过for循环来做到这一点:
assert(size(A,2) == size(B,1));
assert(size(A,3) == size(B,3));
M = size(A,1);
P = size(A,3);
Q = size(B,2);
C = zeros(M, Q, P);
for ii = 1:size(A,3)
C(:,:,ii) = A(:,:,ii) * B(:,:,ii);
end
Run Code Online (Sandbox Code Playgroud)
有没有办法避免for循环?(也许可以使用任意数量维的数组?)
我的问题类似于这个与3D矩阵相乘的3D矩阵.但是,我在Fortran中编码.
再说了,如果我有一个RxSxT矩阵A和SxU矩阵B,其中R,S,T,U是整数,我要乘A(:,:,0)用B.我怎么能这样做matmul?当我做的事情
C(:,:,0) = matmul(A(:,:,0),B)
Run Code Online (Sandbox Code Playgroud)
编译器(gfortran)给出:
Warning:Array reference at (1) is out of bounds (0 < 1) in dimension 3
f951: internal compiler error: Segmentation fault
Run Code Online (Sandbox Code Playgroud)
有没有解决的办法?谢谢.
编辑:我应该补充一点,我实际上是转置第二个矩阵.再说了,A一个RxSxT矩阵和B一个UxS矩阵.然后
C(:,:,0) = matmul(B,transpose(A(:,:,0))
Run Code Online (Sandbox Code Playgroud)
转置可能是问题的一部分.它将A(i,j,k)转换为A(k,i,j)吗?